2008-11-11 74 views
5

我在后台工作线程上运行一系列耗时的操作。在各个阶段,我通过调用委托来更新(窗体)进度条。但是,更多时间操作之一发生在一行代码上。BackgroundWorker线程:更新UI和中止操作

是否有可能:

一个),而正在执行的代码,单线,或至少显示一个动画图标表示的工作正在做的用户更新UI。

B)设在执行

回答

2

的代码一行不幸的是,用户取消后台工作线程,可能不会。后台工作线程需要调用ReportProgress来更新UI线程,并且需要观察CancellationPending以确定是否应该停止。因此,如果您的工作线程正在单线运行,那么无法完成此工作。

也许,我误解了,所以这里的代码,模仿什么,我在得到:

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

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

a)您可以通过使用显示您的形式,而不是一个进度条上的GIF动画PictureBox控制。您可以在this blog post中找到有关如何执行此操作的详细信息。

b)在BackgroundWorker的类具有CancelAsync方法,其将向取消当前操作的请求。
这会将BackgroundWorker的CancellationPending属性设置为“True”。在您的事件处理程序中,您将不得不定期轮询该属性,以便在其值发生更改时采取适当的操作。
还要注意的是这个工作,你必须设置BackgroundWorker的对“真”的WorkerSupportsCancellation财产。

0

你没有误解 - 使用ReportProgress或使用委托(像我一样)基本上达到同样的目的。它开始在后台工作之前

1

你的UI代码可以显示动画,如果需要取消的话,可以终止后台线程。你不会遗憾地利用后台工作者设计。

1

您可以ReportProgress()方法更新UI(或类属性)

所以,如果像你的状态,你的长期运行是固体,反应迟钝,你怎么想计算其进展?这显然是不可能的。
将您的操作尽可能分开,并在每个代码段后拨打ReportProgress()