4

次のコードを変更して複数のタスクを同時に実行するにはどうすればよいですか?

foreach (SyndicationItem item in CurrentFeed.Items)
{
    if (m_bDownloadInterrupted)
    break;

    await Task.Run( async () =>
    {
        // do some downloading and processing work here
        await DoSomethingAsync();
    }
}

また、プロセスを中断して停止できるようにする必要があります。私の DoSomethingAsync メソッドはタグ (グローバルなブール値) を読み取ってプロセスを停止するためです。

ありがとう

4

2 に答える 2

9

いいえ、それはそれらを同時に実行しません-次のものを開始する前に、それぞれが完了するのを待っています。

Task.Run呼び出しの結果をコレクションに入れ、すべて開始してから待機することもできます。Task.WhenAll

Parallel.ForEach(期待できる値が返されないのは残念ですTask。もっと非同期に対応したバージョンがあるかもしれません...)

于 2012-09-06T08:49:41.870 に答える
1

これにより、アイテムが同時に処理されます。

  Parallel.ForEach(CurrentFeed.Items, DoSomethingAsync)

キャンセルできるようにするには、CancellationToken が必要です。

  CancellationTokenSource cts = new CancellationTokenSource();
  ParallelOptions po = new ParallelOptions();
  po.CancellationToken = cts.Token;

  // Add the ParallelOptions with the token to the ForEach call
  Parallel.ForEach(CurrentFeed.Items,po ,DoSomethingAsync)

  // set cancel on the token somewhere in the workers to make the loop stop
  cts.Cancel();

詳細については、(他のソースの中でも) http://msdn.microsoft.com/en-us/library/ee256691.aspxを参照してください。

于 2012-09-06T09:58:42.173 に答える