自从ProgressChanged
事件处理程序是从某个地方引发的DoWork
事件处理程序,不应该在异步操作线程上调用它们吗?DoWork
也运行在 UI 线程上,而不是 UI 线程上,因此需要 Invoke 或BeginInvoke
操纵控制?
我的猜测是,某些魔法正在发生ReportProgress
方法,但它如何知道哪一个是调用该方法的正确线程ProgressChanged
事件处理程序打开?
你打电话时RunWorkerAsync
, the BackgroundWorker
内部创建一个新的AsyncOperation与当前同步上下文关联,通过检索AsyncOperationManager.SynchronizationContext静态属性。
该同步上下文将是派生自的类的实例SynchronizationContext。具体类型取决于您的应用程序使用的同步模型提供程序。如果您运行的是 Windows 窗体,则为WindowsFormsSynchronizationContext;在 WPF 上;这将是DispatcherSynchronizationContext.
当您随后致电ReportProgress
在后台线程上,BackgroundWorker
会内部调用Post就前述的SynchronizationContext
实例,从而将操作异步分派给关联的线程。
在 Windows 窗体中,这是作为Control.BeginInvoke称呼;在 WPF 上,它变成了Dispatcher.BeginInvoke call.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)