BackgroundWorker线程:更新UI和中止操作

时间:2008-11-11 22:29:15

标签: backgroundworker

我在后台工作线程上运行一系列耗时的操作。在不同的阶段,我通过调用委托更新(窗体)进度条。但是,在一行代码中会发生一次更多的时间操作。

是否可以:

a)在执行该单行代码时更新UI,或者至少显示一个动画图标,显示用户正在完成工作。

b)让用户在执行该单行代码时取消后台工作线程

5 个答案:

答案 0 :(得分:2)

不幸的是,可能不是。后台工作线程需要调用ReportProgress来更新UI线程,并且需要查看CancellationPending以了解它是否应该停止。因此,如果您的工作线程在一行中运行并运行,则无法使其工作。

也许,我误解了,所以这里的代码模拟了我所得到的:

public void DoWork() {
    System.Threading.Thread.Sleep(10000);

    // won't execute until the sleep is over
    bgWorker.ReportProgress(100);
}

答案 1 :(得分:1)

a)您可以使用 PictureBox 控件在表单上显示动画GIF而不是进度条。您可以在this blog post中找到有关如何执行此操作的详细信息。

b) BackgroundWorker 类有一个 CancelAsync 方法,该方法将提交取消当前操作的请求。
这将设置 CancellationPending < / strong> BackgroundWorker的属性为“True”。然后,在 DoWork 事件处理程序中,您必须定期轮询此属性,以便在其值更改时采取适当的操作。
另请注意,为此,您必须将BackgroundWorker的 WorkerSupportsCancellation 属性设置为“True”。

答案 2 :(得分:1)

你的ui代码可以在启动后台工作程序之前显示动画。如果需要取消,你可以终止后台线程。遗憾的是,您无法使用后台工作者设计。

答案 3 :(得分:1)

您可以在 ReportProgress()方法

中更新用户界面(或类属性)

因此,如果您说,您的长时间操作是坚实且反应迟钝的,那么您希望如何计算其进度?这显然是不可能的。
将您的操作分成尽可能多的片段,并在每个片段后调用 ReportProgress()

答案 4 :(得分:0)

你没有误解 - 使用ReportProgress或使用委托(就像我一样)实现了基本相同的目标。