0

計算を行う効率的な(可能な限り少ないスレッドを使用する)非同期方法が必要です(そして.net 4を使用します)。1つの方法は

ThreadPool.QueueUserWorkItem(f => job.DoWork()); 
job.Completed += (a, b) => {...} //Completed is event I fire when work is done

もう 1 つの可能性は、基本的にデリゲートを呼び出す C# v.5 より前に行われていた非同期メソッドを実装することです。BeginInvoke

BeginInvoke私の質問は:からの新しいスレッドも使用しているように見えるので、異なる構文以外にこれら 2 つの違いはありThreadPoolますか?

余談ですが、(JavaScriptで行われているように)(C#のどのバージョンでも)呼び出し元と同じスレッドで非同期的にメソッドを定義して呼び出すことは可能ですか?

4

3 に答える 3

1

Task Parallel LibraryTask クラスを見てみましょう。Task Parallel Library (TPL) は、ループの並列実行を提供し、Task クラスを使用すると、タスクを実行するスレッドを制御できます。これは、UI 操作にとって重要です。

于 2013-04-27T12:56:29.650 に答える
1

Joseph Albahari のThreading in C#に関する本 (一部無料) を読むことをお勧めするよりも良い答えはありません。

非同期デリゲート

ThreadPool.QueueUserWorkItem には、スレッドの実行が終了した後にスレッドから戻り値を取得するための簡単なメカニズムはありません。非同期デリゲート呼び出し (略して非同期デリゲート) はこれを解決し、任意の数の型付き引数を双方向に渡すことができます。さらに、非同期デリゲートでハンドルされない例外は、元のスレッド (より正確には、EndInvoke を呼び出すスレッド) で便利に再スローされるため、明示的な処理は必要ありません。

于 2013-04-27T12:45:58.577 に答える
1

Delegate.BeginInvokeそのメソッドを に置きThreadPoolます。の利点は、非同期呼び出しの進行状況を監視するために使用できる をBeginInvoke使用 できることです。IAsyncResultその「兄弟」メソッドでEndInvokeある は、非同期呼び出しの結果を取得します。後はいつでも呼び出すことができますBeginInvoke。非同期呼び出しが完了していない場合は、完了EndInvokeするまで呼び出しスレッドをブロックします。

参照: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

于 2013-04-27T12:50:05.940 に答える