C#线程池等待结果

C#线程池等待结果,c#,.net,multithreading,compiler-errors,C#,.net,Multithreading,Compiler Errors,我想要一个类似的函数: public static V callAsyncAndWait<V>(Func<V> func) { ThreadPool.QueueUserWorkItem(obj => { V v = func.Invoke(); }); return v; } publicstaticv callAsyncAndWait(Func-Func) { ThreadPo

我想要一个类似的函数:

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

    return v;
}
publicstaticv callAsyncAndWait(Func-Func)
{
ThreadPool.QueueUserWorkItem(obj=>
{
V=函数调用();
});
返回v;
}

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

我建议您改用新的.NET 4.0
任务
类。以下是关于如何从执行
任务中返回结果的教程


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

您可以使用async patternt来执行此操作:

public static V callAsyncAndWait<V>(Func<V> func)
{
  var asyncResult = func.BeginInvoke(null, null);

  asyncresult.AsyncWaitHandle.WaitOne();

  return func.EndInvoke(asyncResult);
}
publicstaticv callAsyncAndWait(Func-Func)
{
var asyncResult=func.BeginInvoke(null,null);
asyncresult.AsyncWaitHandle.WaitOne();
返回函数EndInvoke(asyncResult);
}

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

类似于“调用异步和完成时通知”的内容更有意义:

void CallAsyncAndNotifyWhenDone<T>(Func<T> func, Action<T> callback)
{
    ThreadPool.QueueUserWorkItem(obj => 
    {
        T result = func();         
        callback(result);
    });
}
void callasyncandtifywhendone(Func-Func,动作回调)
{
ThreadPool.QueueUserWorkItem(obj=>
{
T结果=func();
回调(结果);
});
}

这毫无意义。调用异步意味着不阻塞调用者线程,这正是您想要的。为什么不在调用线程中调用函数?这真的没有什么区别,
callAsyncAndWait
非常混乱。您想异步启动某个任务或等待流程完成?他的控制流可能类似于:启动异步任务,执行其他任务,等待结果。您不能在DN 3.5和Yearly中使用任务正如我在文章中提到的,这是“新的.NET 4.0任务”。