1

c#5 で新しい async/await keyworks を使用することを検討しており、この記事を読んでいます

次の例が表示されます

async void ArchiveDocuments(List<Url> urls)
{
  Task archive = null;
  for(int i = 0; i < urls.Count; ++i)
  {
    var document = await FetchAsync(urls[i]);
    if (archive != null)
      await archive;
    archive = ArchiveAsync(document);
  }
}

おそらく、URL リストが非常に長い場合、スレッドが制御不能になる状況に陥る可能性があります。

私が知りたいのは、使用されるスレッドの数を制御するための推奨される方法です。スレッドプールまたは最大数を指定する方法はありますか?

TPL を使用すると、オプションを使用してスレッドの最大数 ParallelOptions.MaxDegreeOfParallelism を制御できます。おそらく、 await と Task を組み合わせる何らかの方法が可能かもしれません。

4

2 に答える 2

1

この例のポイントは、最大で1つのフェッチと1つのアーカイブが同時に実行される「パイプライン」パターンを示すことです。

async同時を意味するのではなく、非ブロッキングを意味します。

于 2011-12-22T11:24:04.777 に答える
0

asyncandキーワードは、awaitスレッド自体を作成しません。それは、タスク自体を処理するメソッド次第です。

実際、ファイル システム I/O やネットワーク接続などの操作では、通常、スレッドを非同期で実行する必要はありません。ハードウェアはハードウェアが行うことを行い、それが完了すると、関連するイベントが発生します (C# に戻ります)。

スレッドの数を制御したい場合は、スレッドを作成するメソッドを変更する必要があります。これは、およびとは関係ありませasyncawaits

于 2011-12-22T12:14:51.927 に答える