[C#] 백그라운드 작업자에게 인수를 보내시겠습니까?

백그라운드 작업자에게 int 매개 변수를 보내고 싶다고 가정 해 보겠습니다.이를 어떻게 수행 할 수 있습니까?

private void worker_DoWork(object sender, DoWorkEventArgs e) {

}

이것이 worker.RunWorkerAsync ();이라는 것을 알고 있습니다. worker_DoWork에서 int 매개 변수를 사용해야한다고 정의하는 방법을 이해하지 못합니다.



답변

다음과 같이 시작하십시오.

int value = 123;
bgw1.RunWorkerAsync(argument: value);  // the int will be boxed

그리고

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
   int value = (int) e.Argument;   // the 'argument' parameter resurfaces here

   ...

   // and to transport a result back to the main thread
   double result = 0.1 * value;
   e.Result = result;
}


// the Completed handler should follow this pattern 
// for Error and (optionally) Cancellation handling
private void worker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
  // check error, check cancel, then use result
  if (e.Error != null)
  {
     // handle the error
  }
  else if (e.Cancelled)
  {
     // handle cancellation
  }
  else
  {
      double result = (double) e.Result;
      // use it on the UI thread
  }
  // general cleanup code, runs when there was an error or not.
}


답변

이것이 이미 답변 된 질문이지만 IMO를 훨씬 쉽게 읽을 수있는 다른 옵션을 남겨 두었습니다.

BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (obj, e) => WorkerDoWork(value, text);
worker.RunWorkerAsync();

그리고 핸들러 메소드에서 :

private void WorkerDoWork(int value, string text) {
    ...
}


답변

이와 같은 여러 인수를 전달할 수 있습니다.

List<object> arguments = new List<object>();
                    arguments.Add(argument 1);
                    arguments.Add(argument 1);
                    arguments.Add(argument n);


                    backgroundWorker2.RunWorkerAsync(arguments);

private void worker_DoWork(object sender, DoWorkEventArgs e) {

  List<object> genericlist = e.Argument as List<object>;
  extract your multiple arguments from this list and cast them and use them.

}


답변

DoWorkEventArgs.Argument속성을 사용할 수 있습니다 .

전체 예제 (int 인수를 사용하더라도)는 Microsoft 사이트에서 찾을 수 있습니다.


답변

DoWorkEventArgs.Argument 특성을 확인하십시오 .

...
backgroundWorker1.RunWorkerAsync(yourInt);
...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // Do not access the form's BackgroundWorker reference directly.
    // Instead, use the reference provided by the sender parameter.
    BackgroundWorker bw = sender as BackgroundWorker;

    // Extract the argument.
    int arg = (int)e.Argument;

    // Start the time-consuming operation.
    e.Result = TimeConsumingOperation(bw, arg);

    // If the operation was canceled by the user, 
    // set the DoWorkEventArgs.Cancel property to true.
    if (bw.CancellationPending)
    {
        e.Cancel = true;
    }
}


답변

여러 유형의 인수를 전달하려면 먼저 Object 유형의 배열에 모두 추가하고 해당 오브젝트를 RunWorkerAsync ()에 전달하십시오. 예는 다음과 같습니다.

   some_Method(){
   List<string> excludeList = new List<string>(); // list of strings
   string newPath ="some path";  // normal string
   Object[] args = {newPath,excludeList };
            backgroundAnalyzer.RunWorkerAsync(args);
      }

이제 백그라운드 작업자의 doWork 메소드에서

backgroundAnalyzer_DoWork(object sender, DoWorkEventArgs e)
      {
        backgroundAnalyzer.ReportProgress(50);
        Object[] arg = e.Argument as Object[];
        string path= (string)arg[0];
        List<string> lst = (List<string>) arg[1];
        .......
        // do something......
        //.....
       }


답변

RunWorkerAsync (object) 메소드와 DoWorkEventArgs.Argument 특성 이 필요 합니다.

worker.RunWorkerAsync(5);

private void worker_DoWork(object sender, DoWorkEventArgs e) {
    int argument = (int)e.Argument; //5
}