C#线程池等待结果

本文关键字:结果 等待 线程 | 更新日期: 2023-09-27 18:21:18

我想要一个类似的函数:

public static V callAsyncAndWait<V>(Func<V> func)
{
    ThreadPool.QueueUserWorkItem(obj => 
    {
        V v = func.Invoke();                 
    });
    return v;
}

显然,这段代码无法编译。我想要的是在另一个线程中运行Func并返回结果。我该怎么做?

C#线程池等待结果

我建议您改用新的.NET 4.0 Task类。以下是关于如何从执行Task返回结果的教程:http://msdn.microsoft.com/en-us/library/dd537613.aspx

实际上,您有一个非常方便的属性Result,在调用getter时,它将被阻塞,直到结果可用。

这没有太大意义。如果该方法应该等待任务完成,那么您根本不需要单独的线程。

类似"调用async并完成后通知"的内容更有意义:

void CallAsyncAndNotifyWhenDone<T>(Func<T> func, Action<T> callback)
{
    ThreadPool.QueueUserWorkItem(obj => 
    {
        T result = func();         
        callback(result);
    });
}

您可以使用异步模式来实现:

public static V callAsyncAndWait<V>(Func<V> func)
{
  var asyncResult = func.BeginInvoke(null, null);
  asyncresult.AsyncWaitHandle.WaitOne();
  return func.EndInvoke(asyncResult);
}