重新启动后台工作人员C#和WPF
我读到了有关BackgroundWorker课程的文章 我试图实现一个重置按钮,所以我添加了以下代码 在.xaml的页面中:重新启动后台工作人员C#和WPF,c#,backgroundworker,C#,Backgroundworker,我读到了有关BackgroundWorker课程的文章 我试图实现一个重置按钮,所以我添加了以下代码 在.xaml的页面中: <Button x:Name="buttonReset" Content="Reset" Click="buttonReset_Click" Width="80" Height="30"/> private void buttonReset_Click(object sender, RoutedEventArg
<Button x:Name="buttonReset" Content="Reset" Click="buttonReset_Click"
Width="80" Height="30"/>
private void buttonReset_Click(object sender, RoutedEventArgs e)
{
if (bw.WorkerSupportsCancellation == true)
{
bw.CancelAsync();
}
// How to restart?
bw.RunWorkerAsync(); // Raises busy exception
}
但我得到以下错误:
意大利语:
此BackgroundWorker正忙,无法同时执行多个任务
只有当我按下启动a然后重置时,才会发生这种情况
为什么??如何修复
请注意,即使有效,这也是一个糟糕的解决方案
我试过这个:
private void buttonReset_Click(object sender, RoutedEventArgs e)
{
if (bw.WorkerSupportsCancellation == true)
{
bw.CancelAsync();
while (bw.IsBusy)
{
DoEvents();
}
}
bw.RunWorkerAsync();
}
public static void DoEvents()
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
new Action(delegate { }));
}
这就解决了问题
我特别补充说:
while (bw.IsBusy)
{
DoEvents();
}
其中定义了DoEvents()
:
public static void DoEvents()
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
new Action(delegate { }));
}
如前所述()
注意:特别感谢一位神秘用户,他在此处回复了问题,但删除了他的答案。您可以在取消后立即丢弃此BGWorker实例,然后创建一个新实例。在现代解决方案中,您应该使用任务类而不是BGWorker。我尝试添加
bw.Dispose();bw=新的BackgroundWorker()代码>这避免了异常,但其他按钮不再起作用,因此我认为此建议无法解决我的问题:(请注意,bw
是该类的一个全局变量。因为当您创建新的ISN时,您必须重新设置所有内容:`bw.WorkerReportsProgress=true;bw.workerSupportsScanCellation=true;bw.DoWork+=新的DoWorkEventHandler(bw_DoWork);bw.ProgressChanged+=新的ProgressChangedEventHandler(bw_ProgressChanged);bw.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);`只需将方法更改为私有异步无效按钮1\单击(…){wait Task.Run(()=>CallThatMethod());txtStatus.Text=“Tada!”}
。如果您想要取消,请使用CancellationTokenSource和CancellationToken,例如等待任务。运行(()=>…,cts.Token);
无论如何,您链接到的指南都是古老的。它是关于Silverlight的,一个废弃的平台。即使在那时,人们使用任务,而不是BGWBad应答。Application.DoEvents()
。无论如何都不会封送对调度程序的调用,这意味着当您在UI线程上运行一个长作业时,允许UI处理消息。您在这里所做的是使用一种复杂的方式使BGW启动另一个线程。不必使用所有这些代码只是为了在后台运行某些东西。为什么要使用BGW?您知道什么你的worker方法怎么办?为什么不使用任务。运行?@PanagiotisKanavos我必须在XAML中更新列表框中列出的许多进度条。我为每个进度条启动一个BGW。然后一些进度条应该被重置。然后你就有多个bug。你不能从BGW worker方法内部更新任何UI元素。这就是它的优点gress事件用于。最后,它的“完成”事件用于重置进度条。运行BGW和更新100个进度条不需要任何代码。使用Task.run,您只需要更少的codePost,并询问您实际想要做什么,而不是您认为的解决方案。数据绑定使更新多个UI元素成为可能ivial。async/await
使在后台工作而不阻塞变得容易。