C#如何从工作线程将对象传递回主线程?

时间:2010-08-16 23:56:30

标签: c# multithreading

如何处理工作线程公共方法返回的数据?

感谢。

3 个答案:

答案 0 :(得分:3)

如果工作线程是Task<TResult>,那么您可以从Task<TResult>.Result属性中检索结果。

如果工作线程是BackgroundWorker,那么您可以从传递给 RunWorkerCompletedEventArgs.Result的参数对象中的BackgroundWorker.RunWorkerCompleted属性中检索结果。

如果工作线程是通过ThreadPool执行的Delegate.BeginInvoke线程,那么即使代理人已经完成,您也可以通过调用EndInvoke来检索结果。

如果工作线程是通过Thread执行的ThreadPoolThreadPool.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
}