and*_*ree 9 .net c# backgroundworker
我需要在每个循环中从我的backgroundworker返回多个STRING值,所以我尝试使用ReportProgress第二个参数作为字符串数组.代码示例:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string[] workerResult = new string[2];
for (int i=0; i<someNumber; i++)
{
//do some heavy calculating
workerResult[0] = "this string";
workerResult[1] = "some other string";
backgroundWorker1.ReportProgress(i, workerResult) // also tried workerResult[] and [2]
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
string[] results = (string[])e.UserState;
MessageBox.Show(results[0]); // line of error
MessageBox.Show(results[1]); // line of error
}
Run Code Online (Sandbox Code Playgroud)
它编译,但在运行时我尝试访问Userstate返回的字符串,我收到一个错误:"对象引用未设置为对象的实例."
对我来说,似乎在将数组参数传递给ProgressChanged委托时出错,或者在尝试设置结果数组值时使用ProgressChanged方法.
Han*_*ant 18
您的代码段无法重现问题.标准错误是调用ReportProgress()然后继续修改对象.事件处理程序运行需要一段时间,它将看到修改后的对象,而不是原始对象.您可以通过简单地创建一个新对象来避免这种情况,以便事件处理程序始终使用原始对象.像这样:
//do some heavy calculating
for (int i = 0; i < 2; ++i) {
string[] workerResult = new string[2];
workerResult[0] = "this string";
workerResult[1] = "some other string";
backgroundWorker1.ReportProgress(i, workerResult);
}
Run Code Online (Sandbox Code Playgroud)
请注意数组创建语句如何在循环内移动.
当您实例化BackgroundWorker时,您必须将reportprogress设置为true:
worker = new BackgroundWorker { WorkerReportsProgress = true };
Run Code Online (Sandbox Code Playgroud)
在do work方法上你只需要这个:
worker.ReportProgress(10, "Message");
Run Code Online (Sandbox Code Playgroud)
然后像这样来抓住进展:
private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e) {
if (e.UserState != null) {
MessageBox.Show(e.UserState);
}
}
Run Code Online (Sandbox Code Playgroud)