3

以前は、サービス呼び出しを行うためにバックグラウンドワーカースレッドを使用し、UIスレッドをブロックしていませんでした。現在、TPLの使用を開始していますが、CPUを集中的に使用するタスクにはタスクを使用するのが理想的です。

それでは、サービス呼び出しが完了するまでアイドル状態になっているスレッドが多数あるため、サービス呼び出しを行うためにタスクフェイシングを使用することに何か問題があるのではないかと考えていますか?

また、元の質問に関して、作成されたタスクがWPFアプリケーションのUIスレッドとは異なるスレッドで常に呼び出されるという保証はありますか?

4

2 に答える 2

6

それTaskCreationOptions.LongRunningが目的です。これは、タスクが完了するまでに時間がかかることをタスクスケジューラに通知するため、スレッドプールの限られたリソースは使用されません。

実際の質問に関しては、UIスレッドでタスクが実行される唯一の可能な方法は次のとおりです。

于 2012-05-13T09:34:52.350 に答える
6

タスクは、何らかの方法で実行するようにスケジュールされている作業の抽象化です。CPUを集中的に使用する必要はありません。

通常、を作成するTaskと、デフォルトのスケジューラが使用され、スレッドプールでスケジュールされます(つまり、UIスレッドにはスケジュールされません)。を使用TaskScheduler.FromCurrentSynchronizationContextして、作業をUIスレッドに投稿するスケジューラーを作成できます。

タスクと同様の動作を実現するにはBackgroundWorker、次を使用できます。

var syncScheduler = TaskScheduler.FromCurrentSynchronizationContext(); // must be called on the UI thread
var task = ... // create the task
task.ContinueWith(t => { /* update the UI here */ }, syncScheduler);

サービス呼び出しに関して、IOを待機しているスレッドプールスレッドを無駄にしたくない場合は、この投稿で説明されているように、WCFのAPMパターンを組み合わせて使用​​する必要があります。TaskFactory.FromAsync

于 2012-05-13T09:49:31.267 に答える