2012-01-25 36 views
2

C#線程池等待我想有一個功能類似的東西:的結果

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

    return v; 
} 

顯然,這代碼不能編譯。我想要的是在另一個線程中運行Func並返回結果。我怎樣才能做到這一點?

+0

這是沒有意義的。調用異步意味着不阻塞調用者線程,這正是你想要的。爲什麼不調用調用線程中的函數?它真的沒有區別 – Matten

+0

'callAsyncAndWait'是非常混亂的。你想異步啓動**或**等待進程完成? – ken2k

+0

可能他的控制流程如下:啓動異步任務,執行其他操作,等待結果。 – Tudor

回答

3

我建議您改用新的.NET 4.0 Task類。下面是關於如何從Task執行返回結果的教程:http://msdn.microsoft.com/en-us/library/dd537613.aspx

實際上你有一個非常方便的特性叫做Result,其中,在吸氣的調用,將阻塞,直到結果可用。

+1

不能使用DN 3.5和每年的任務 –

+1

正如我在文章中提到的那樣,它是「新的.NET 4.0任務」。 – Tudor

1

您可以使用異步patternt做到這一點:

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

    asyncresult.AsyncWaitHandle.WaitOne(); 

    return func.EndInvoke(asyncResult); 
} 
2

這並不是什麼太大的意義。如果該方法應該爲等待完成任務,則根本不需要單獨的線程。

類似「呼叫異步和通知完成時」會更有意義:

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