답변:
다음과 같이 시작하십시오.
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.
}
Tuple<A,B>
(C # 4 +)를 사용하십시오 (편집 : 예, 개체를 모두 묶기 위해 개체를 사용하십시오. 예를 들어 DoWorkEventArgs self 참조).
label1.Text = e.Result.ToString();
, 어디에서나 안전하다고 표시했습니다.
이것이 이미 답변 된 질문이지만 IMO를 훨씬 쉽게 읽을 수있는 다른 옵션을 남겨 두었습니다.
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (obj, e) => WorkerDoWork(value, text);
worker.RunWorkerAsync();
그리고 핸들러 메소드에서 :
private void WorkerDoWork(int value, string text) {
...
}
... => WorkerDoWork(a, b, c);
는 메소드 서명과 일치하는만큼을... WorkerDoWork(int a, string b, string c) {...
이와 같은 여러 인수를 전달할 수 있습니다.
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.
}
Tuple
일반적인 객체의 목록보다는 (또는 특수화 된 클래스)를 선호 할 것입니다
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
}
항상 객체 유형 목록이 아닌 콘크리트 유형 (복합 디자인 패턴 사용)의 복합 객체를 사용해야합니다. 각각의 대상이 무엇인지 누가 기억할까요? 나중에 코드 유지 관리에 대해 생각해보십시오. 대신 다음과 같이 시도하십시오.
Public (Class or Structure) MyPerson
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public int ZipCode { get; set; }
End Class
그리고:
Dim person as new MyPerson With { .FirstName = “Joe”,
.LastName = "Smith”,
...
}
backgroundWorker1.RunWorkerAsync(person)
그리고:
private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e)
{
MyPerson person = e.Argument as MyPerson
string firstname = person.FirstName;
string lastname = person.LastName;
int zipcode = person.ZipCode;
}