2011-12-07 16 views
0

私は、タスク並列ライブラリを使用して実行したい任意の操作のセットを持っています。 Task.Factory.StartNewを使用して、新しいバックグラウンドスレッドをスピンアップする必要はありません。タスクを使用した任意の操作の非同期実行

タスクフレームワークを使用して任意の操作を非同期で実行するにはどうすればよいですか? Task.Factory.FromAsyncを使用するには、操作でBeginメソッドとEndメソッドを公開する必要があります。

これについてのガイダンスは高く評価されます。

答えて

1

Task.Factory.StartNew()新しいバックグラウンドスレッドを開始していることを意味します。その代わりに、TPLはスレッドプールを使用しています。スレッドプールは、渡されたデリゲート/メソッドを実行するためのスレッドが利用可能になった時点で選択できます。

したがって、このメソッドは非同期に実行され、新しいスレッドが開始されることはありません。デリゲートが実行されるときは、TPLのスケジューリングアルゴリズムと競合するスレッドの数がすでに実行されているかどうかによって異なります。通常、TPLはマシン上で使用可能なすべてのプロセッサを試して使用します。

+0

はい、私はそれがスレッドプールからスレッドを使用することを理解します。私が欲しいのは、スレッドプールからスレッドを使用する代わりに、同じスレッドで任意の操作を非同期的に実行したいということです。デリゲートでBeginInvokeを呼び出すと、これは同じスレッドで実行されますが、非同期で実行されます。私はタスクと同様の機能を達成したいです。 –

+1

デリゲートのBeginInvokeは、実際には操作の実行にスレッドプールスレッドを使用します。呼び出し元と同じスレッドは使用されません。 –

+0

うーん...これは私が解決しようとしていることです。別のWCFサービスとデータベースを呼び出し、集中的な処理を行うWCFサービス操作を実装する必要があります。 Task.Factory.StartNew()を使用すると、スレッドプールからのスレッドが使用されますが、IO要求が行われると、別のWCFサービスに送信されると、スレッドプールスレッドがブロックされます。私の理解が正しい場合、IOを待つ間にWCFスレッドがブロックされないように、これをどのように記述しますか? –

0

async/awaitを使用して、1つのスレッドで非同期操作を実行できます。スレッドが必要です

System.Threading.SynchronizationContext.Current != null 

スレッドプールスレッドが使用されています。 たとえば、スレッドを使用しているときに同期コンテキスト(メッセージキューあり)が表示されます。 WinForms、WPFまたはNito.Async.ActionThread。 threadsafety and the message queueを参照してください。 他のWCFサービスを呼び出すWCFサービスには、AsyncWcfLibを使用します。

関連する問題