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任务”。