3

同期的に動作する.NET4.5WCFクライアントがあります。新しい非同期/待機機能を使用して複数の同時サーバー呼び出しを行い、データのチャンクを同時に取得するように更新しています。

終了する前に、同時に実行されているすべてのスレッドがサーバーを飽和させるのではないかと心配しています(もちろん、来年にアップグレードするときにAzureワーカーの役割を強制終了します)。クラスレベルで使用するタスクスレッドの総数を一元管理する方法はありますか?このコードは、他のWCFクライアントコードとアセンブリを共有します。

すべてのアイデアをありがとう。

4

2 に答える 2

2

質問に文字通り答えるには、独自のTaskSchedulerを実装し、作成するすべてのタスクに割り当てることで、タスクの処理に使用するスレッドの数を制御できます。Microsoftには完全に機能する例さえあります。

ただし、根本的な問題に答えるために:Taskを意味するものではありませんThread。実際、async / awaitの主な目標は、アプリのスレッド数を減らすことです。実際には、アプリ全体をasync / awaitとTasksを中心に設計し、単一のスレッドのみを使用する何千もの同時タスクを実行することが可能です。

コードをできるだけ少ないスレッドで実行する必要があります。理想的には、使用している論理CPUの数を超えないようにし、コードと同時にI/Oを実行する必要があります。OSは、追加のスレッドを作成することなく、すべてのI/Oを管理できます。タスクはこれを達成するのに役立ちます。

タスクごとのスレッドを作成できるのは、非同期性をエミュレートしている場合のみです。Task.Runを呼び出してブロッキングコードを実行します。この種のコードは確かに賢明ではありません。

Task t1 = Task.Run(()=>DownloadFile(url1));
Task t2 = Task.Run(()=>DownloadFile(url2));

await Task.WhenAll(t1, t2)

真の非同期コード(単一のスレッドで実行できる)ははるかに優れています。例:

Task t1 = DownloadFileAsync(url1);
Task t2 = DownloadFileAsync(url2);

await Task.WhenAll(t1, t2)

または、任意の数のタスクの場合:

List<Task> tasks = new List<Task>();

foreach(string url in urls)
{
    tasks.Add(DownloadFileAsync(url))
}

await Task.WhenAll(tasks);
于 2012-11-26T23:22:02.963 に答える
1

非同期WCFサーバーのコンテキストでは、「タスクスレッド」はありません。

進行中のリクエストを表すインスタンスがありますTaskが、それらはスレッドプールスレッドではありません。サーバーは、必要に応じて、実行する必要のある要求にスレッドプールを割り当てます。(で)非同期的に待機しているリクエストにはawaitスレッドがありません。

于 2012-11-26T23:36:46.517 に答える