【发布时间】:2017-01-10 13:54:52
【问题描述】:
我的 wpf 应用程序中有几个文本框。每个文本框的 LostFocus-Event 启动一个后台工作程序,将数据发送到连接的串口。
private readonly BackgroundWorker online_mode_send_worker = new BackgroundWorker();
online_mode_send_worker.DoWork += online_mode_send_worker_DoWork;
online_mode_send_worker.RunWorkerCompleted += online_mode_send_worker_RunWorkerCompleted;
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
online_mode_send_worker.RunWorkerAsync(data);
}
private void online_mode_send_worker_DoWork(object sender, DoWorkEventArgs e)
{
List<object> data = (List<object>)e.Argument;
Port.WriteLine(STARTCHARACTER + XMLSET + XML_TAG_START + data[0] + XML_TAG_STOP + data[1] + ENDCHARACTER);
string received = Port.ReadLine();
}
private void online_mode_send_worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//do some things after worker completed
}
此时,一切正常。
但有时我必须一个接一个地直接发送两个数据点,我遇到了问题。
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
online_mode_send_worker.RunWorkerAsync(data1);
//wait until backgroundworker has finished
online_mode_send_worker.RunWorkerAsync(data2);
}
Backgroundworker 仍在运行,我得到一个异常抛出。
是否可以在第一个online_mode_send_worker.RunWorkerAsync(data) 完成后等待,然后再启动第二个online_mode_send_worker.RunWorkerAsync(data)?
while(online_mode_send_worker.isBusy); 不工作,因为主线程阻塞,RunWorkerCompleted() 没有被抛出,所以Backgroundwoker 总是很忙。
我找到了类似的东西,但是 Application.DoEvents() 在 wpf 中不可用。
while (online_mode_send_worker.IsBusy)
{
Application.DoEvents();
System.Threading.Thread.Sleep(100);
}
【问题讨论】:
-
除非某些东西已经存在,否则我认为您可以创建一个封装后台工作者的服务。这个类也将有一个队列。保存任何数据。当工作开始时,工人处理数据。如果要发送更多数据,请将其添加到队列中。当工作人员完成时,它会检查队列以查看是否还有更多工作要做,并将下一个工作出列并再次调用后台工作人员,否则正常完成。
-
使用“任务”而不是后台工作人员。使用 Backgroundworker 似乎真的过时了。 dotnetperls.com/async
标签: c# wpf backgroundworker