![]() |
1
12
通过创建BackgroundWorker组件并在其DoWork处理程序中执行工作,可以轻松实现(2):
每个后台工作人员都可以通过调用report progress向UI线程报告进度:尽管这主要是为报告有界进程的进度而设计的,但这不是必需的——如果您的UI更新需要这样做,您也可以传递自己的自定义数据。您将从DoWork处理程序调用ReportProgress。 BackgroundWorker的好处在于它为您处理了许多混乱的交叉线程细节。它还符合事件驱动的更新模型,您(正确地)更喜欢显式回调。 |
![]() |
2
1
我也投了2的票,但是 BackgroundWorkers 而不是System.Threading.Threads。 |
![]() |
3
1
在大多数情况下,最容易做的事情就是使用Itowlson答案中建议的BackgroundWorker组件,如果可能的话,我强烈建议使用这种方法。如果出于某种原因,您不能为自己的目的使用BackgroundWorker组件,例如使用.NET 1.1(Yikes!)或者使用紧凑的框架,那么您可能需要使用另一种方法: 对于WinForm控件,您必须避免修改除最初创建控件的线程之外的任何线程上的控件。BackgroundWorker组件为您处理这个问题,但是如果您不使用它,那么您可以并且应该使用System.Windows.Forms.Control类上的invokeRequired属性和invoke方法。下面是使用此属性和方法的示例:
|
![]() |
4
0
您可以让工作线程引发事件,并让主UI线程添加事件处理程序。您需要小心,不要引发太多的事件,因为如果您的工作线程每秒引发多个事件,则可能会变得很难看。 This 文章给出了一个快速的概述。 |
![]() |
5
0
在应用程序中实现多线程的首选方法是使用
BackgroundWorker
组件。BackgroundWorker组件使用事件驱动模型进行多线程处理。工作线程运行DoWork事件处理程序,创建控件的线程运行ProgressChanged和RunWorkerCompleted事件处理程序。
看 here 例如如何使用BackgroundWorker。 |
![]() |
6
0
如果要创建自己的线程(非BackgroundWorker或ThreadPool线程),可以从主线程传递一个回调方法,该方法是从工作线程调用的。这还允许您将参数传递给回调,甚至返回一个值(例如go/no go标志)。在回调中,通过目标控件的调度程序更新UI:
|
![]() |
Devang Sanghani · 柏树检查线通过 2 年前 |
![]() |
Brendan · 如何在Flatter中创建圆形化身周围的虚线边框 3 年前 |
![]() |
Shadow43375 · 当前可见的视口部分是否有官方术语? 6 年前 |
![]() |
HyperQBE · 如何在pyqt MessageBox中使用变量 6 年前 |
![]() |
Lord Jesus · 如何添加“HH:mm:ss”格式的秒表? 6 年前 |