重新启动后台工作人员C#和WPF

重新启动后台工作人员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

我读到了有关BackgroundWorker课程的文章

我试图实现一个重置按钮,所以我添加了以下代码

在.xaml的页面中:

<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
使在后台工作而不阻塞变得容易。