假设我想向后台工作者发送一个整数类型的参数,应该如何实现?
private void worker_DoWork(object sender, DoWorkEventArgs e) {
}
我知道这个是worker.RunWorkerAsync();,但我不理解如何在worker_DoWork中定义它应该使用一个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.
}
虽然这个问题已经有了答案,但我想提供另一种选择,我认为这种方法更易于阅读:
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) {...
。 - dcarneiroList<object> arguments = new List<object>();
arguments.Add("first"); //argument 1
arguments.Add(new Object()); //argument 2
// ...
arguments.Add(10); //argument n
backgroundWorker.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
(或专门的类),而不是一组通用对象的列表。 - James S请查看DoWorkEventArgs.Argument Property,它与IT技术有关。
...
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......
//.....
}
_dirs = (string[])e.Argument;
但是这个 _dirs = e.Argument as string[];
是有效的。强制转换尝试将其转换为接口,而代码编译通过了... 非常感谢! - Marcelo Scofano Dinizworker.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;
}
Tuple<A,B>
(C#4+)来打包数据(编辑:是的,使用一个对象将所有数据打包起来。例如可以看一下DoWorkEventArgs self
)。 - H Hlabel1.Text = e.Result.ToString();
。 - H H