【发布时间】:2017-11-09 03:16:24
【问题描述】:
我的程序必须同时在不同的插槽中测试多个产品。当插槽出现错误,如意外从计算机上脱落时,程序会假设将用户在启动 UI 时提供的错误类型和产品序列号记录到文本文件中。
我正在使用 Background Worker 来处理多线程。虽然我已经设法使用 e.Error 记录错误类型,但我似乎无法弄清楚如何将 DoWork 函数中的序列号传递给 Background Worker 错误处理程序。
我尝试在谷歌上搜索解决方案,但似乎以前没有人问过这个问题。我将非常感谢提供的任何帮助。 PS:我对 C# 很陌生,所以要温柔哈哈 :)
下面是示例代码:
private void startAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
}
}
private void cancelAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
// Cancel the asynchronous operation.
backgroundWorker1.CancelAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
int b = 0; //simulate error
for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
string[] array2 = { "1", "cancelled" };
e.Result = array2; //passing values when user cancel through e.Result object
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
worker.ReportProgress(i * 10, "Test a");
int a = 1 / b; //simulate error
System.Threading.Thread.Sleep(1000);
}
string[] array1 = {"1","done"};
e.Result = array1; //passing values when complete through e.Result object
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
resultLabel.Text = e.ProgressPercentage.ToString() + "%" + e.UserState.ToString();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
string[] someArray2 = e.Result as string[];
string sernum = someArray2[0];
string status = someArray2[1];
resultLabel.Text = sernum + " " + status;
}
else if (e.Error != null)
{
resultLabel.Text = "Error: " + e.Error.Message; //how to pass sernum here?
}
else
{
string[] someArray = e.Result as string[];
string sernum = someArray[0];
string status = someArray[1];
resultLabel.Text = sernum + " " + status;
}
}
【问题讨论】:
-
您已经将数据从 DoWork 传递到
RunWorkerCompleted。似乎是什么问题? -
你有没有考虑过从
BackgroundWorker切换到TPL和async/await? -
@VMAtm 使用 async/wait 有什么好处?我仍在我的程序中使用 backgroundworker
-
async/await将不需要线程进行 IO 操作,后台工作人员会。此外,代码将比您的代码容易得多。此外,通过 TPL 的取消逻辑比您的简单,您不需要使用Sleep.Wait。旁注:if (worker.CancellationPending == true)等价于if (worker.CancellationPending)
标签: c# multithreading variables backgroundworker