如何处理工作线程公共方法返回的数据?
感谢。
答案 0 :(得分:3)
如果工作线程是Task<TResult>
,那么您可以从Task<TResult>.Result
属性中检索结果。
如果工作线程是BackgroundWorker
,那么您可以从传递给
RunWorkerCompletedEventArgs.Result
的参数对象中的BackgroundWorker.RunWorkerCompleted
属性中检索结果。
如果工作线程是通过ThreadPool
执行的Delegate.BeginInvoke
线程,那么即使代理人已经完成,您也可以通过调用EndInvoke
来检索结果。
如果工作线程是通过Thread
执行的ThreadPool
或ThreadPool.QueueUserWorkItem
线程,则必须通过设置参数的子对象“返回”结果,方法是使用lambda-bound变量,或者使用全局变量。
答案 1 :(得分:0)
取决于 什么是主线? 它对数据做了什么?
例如,在WinForms中,您可以调用Invoke
方法在主线程上以数据作为参数运行回调。
答案 2 :(得分:0)
这取决于线程是如何创建的以及主线程是什么类型的线程。如果它是WinForms或WPF线程,最直接的方法是使用主线程的SynchronizationContext
在工作线程完成后在主线程上执行操作。
void StartWorker() {
var context = SynchronizationContext.Current;
ThreadPool.QueueUserWorkItem(WorkerThread, context);
}
void WorkerThread(object state) {
var context = (SynchronizationContext)state;
...;
context.Post(WorkerDone, ...);
}
void WorkerDone(object state) {
// back on UI thread
}