C#線程池等待我想有一個功能類似的東西:的結果
public static V callAsyncAndWait<V>(Func<V> func)
{
ThreadPool.QueueUserWorkItem(obj =>
{
V v = func.Invoke();
});
return v;
}
顯然,這代碼不能編譯。我想要的是在另一個線程中運行Func並返回結果。我怎樣才能做到這一點?
C#線程池等待我想有一個功能類似的東西:的結果
public static V callAsyncAndWait<V>(Func<V> func)
{
ThreadPool.QueueUserWorkItem(obj =>
{
V v = func.Invoke();
});
return v;
}
顯然,這代碼不能編譯。我想要的是在另一個線程中運行Func並返回結果。我怎樣才能做到這一點?
我建議您改用新的.NET 4.0 Task
類。下面是關於如何從Task
執行返回結果的教程:http://msdn.microsoft.com/en-us/library/dd537613.aspx
實際上你有一個非常方便的特性叫做Result
,其中,在吸氣的調用,將阻塞,直到結果可用。
不能使用DN 3.5和每年的任務 –
正如我在文章中提到的那樣,它是「新的.NET 4.0任務」。 – Tudor
您可以使用異步patternt做到這一點:
public static V callAsyncAndWait<V>(Func<V> func)
{
var asyncResult = func.BeginInvoke(null, null);
asyncresult.AsyncWaitHandle.WaitOne();
return func.EndInvoke(asyncResult);
}
這並不是什麼太大的意義。如果該方法應該爲等待完成任務,則根本不需要單獨的線程。
類似「呼叫異步和通知完成時」會更有意義:
void CallAsyncAndNotifyWhenDone<T>(Func<T> func, Action<T> callback)
{
ThreadPool.QueueUserWorkItem(obj =>
{
T result = func();
callback(result);
});
}
這是沒有意義的。調用異步意味着不阻塞調用者線程,這正是你想要的。爲什麼不調用調用線程中的函數?它真的沒有區別 – Matten
'callAsyncAndWait'是非常混亂的。你想異步啓動**或**等待進程完成? – ken2k
可能他的控制流程如下:啓動異步任務,執行其他操作,等待結果。 – Tudor