Web ロールにいくつかのワーカー スレッドがあります。OnStart
メソッドで作成されます。
Task.Factory.StartNew(() => DoWorkAsync(), TaskCreationOptions.LongRunning);
次に、DoWorkAsync
メソッドはキューのポーリングを続行し、時間のかかる作業を行います。実際の作業には、クエリ ジョブを送信して結果が返されるまで数分かかります。それらの機能はasync
パターンにあります。トップレベルのDoWorkAsync
メソッドを実装する正しい方法は何ですか? 次のようにすると、ここでは一種のブロッキングになり、1 つだけPollingQueueAndWorkAsync()
が呼び出されます。
public async void DoWorkAsync()
{
while (_continue)
{
await PollingQueueAndWorkAsync();
}
}
それとも以下?別のスレッドでメソッドを実行し続けるため、正しく見えません。
public async void DoWorkAsync()
{
while (_continue)
{
Task.Run(() => PollingQueueAndWorkAsync());
}
}
コードを「ずっと非同期」になるようにリファクタリングしようとしていました。しかし、最上位のワーカー メソッドではどのように終了する必要があるのでしょうか?
[アップデート]
さらに試した後、ここに私が持っているものがあります:
public async void DoWorkAsync()
{
while (_continue)
{
Task.Run(async () => await PollingQueueAndWorkAsync());
}
}
新しいメッセージがキューに追加され続けるため、このループはキュー内のメッセージと同じ数を処理できます。ただし、これをしばらく実行すると、メモリ例外がスローされます。あまりにも多くの継続を作成するためですか?では、SemaphoreSlim を使用してタスクの数を調整する必要がありますか?