2012-01-25 10 views
2

に待つ:C#ThreadPoolのは、私は似たように機能を持つようにしたい結果

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クラスを代わりに使用することをお勧めします。

http://msdn.microsoft.com/en-us/library/dd537613.aspxは実際にあなたが結果が使用可能になるまでゲッターの呼び出し時に、ブロックされます、Resultと呼ばれる非常に便利な性質を持っている:ここでTaskの実行から結果を返す方法についてのチュートリアルです。

あなたがそれを行うには非同期patterntを使用することができます
+1

DN 3.5と年単位でタスクを使用することはできません –

+1

投稿で述べたように、これは「新しい.NET 4.0タスク」です。 – Tudor

1

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); 
    }); 
} 
関連する問題