6

MSDNによると:

親タスクはすべての子タスクが終了するのを暗黙的に待機するため、AttachedToParentオプションを使用して構造化タスクの並列処理を表現できます。

だから私はこのコードを持っています:

public async Task<int> GetIntAsync()
{
    var childTask = Task.Factory.StartNew(async () =>
    {
        await Task.Delay(1000);
    },TaskCreationOptions.AttachedToParent);

    return 1;
}

public async Task<ActionResult> Index()
{
    var watch = Stopwatch.StartNew();
    var task = GetIntAsync();
    var result = await task;
    var time = watch.ElapsedMilliseconds;

    return View();  
}

なぜ時間が1000ではなく0なのか知りたいのですが。

4

3 に答える 3

7

タスクベースの非同期パターン(TAP)を使用するコードは、通常はを使用しませんAttachedToParentAttachedToParentタスク並列ライブラリ(TPL)の設計の一部でした。TPLとTAPはどちらも同じタイプを共有しTaskますが、TAPコードで回避する必要のあるTPLメンバーが多数あります。

awaitTAPでは、「親」非同期メソッドに「子」非同期メソッドからタスクが返されるようにすることで、「親」および「子」非同期メソッドの概念をサポートできます。

public async Task<int> GetIntAsync()
{
  var childTask = Task.Run(() =>
  {
    ...
    await Task.Delay(1000);
    ...
  });
  ...

  await childTask;
  return 1;
}
于 2013-01-04T19:06:16.103 に答える
4

AttachedToParentは、スケジュールされているタスクにのみアタッチします。asyncメソッドによって返されるタスクはスケジュールされていませんが、(暗黙的に)TaskCompletionSourceから取得されます。

于 2013-01-04T03:03:07.450 に答える
2

これは、動的な数の子タスクに対して機能するソリューションです。

リストを使用することは、一般的に、単純です。

public async Task<int> GetIntAsync()
{
    var childTasks = new List<Task>();

    while (...)
    {
        ...
        childTasks.Add(Task.Run(...));
        ...
    }

    await Task.WhenAll(childTasks);

    return 1;
}

たとえば、子タスクが短命であり、新しいタスクが迅速かつ無制限に作成される場合、リストはオーバーフローします。

代わりに、1つのタスクのみを使用できます。

public async Task<int> GetIntAsync()
{
    var childrenTask = Task.WhenAll();

    while (...)
    {
        ...
        childrenTask = Task.WhenAll(Task.Run(...), childrenTask);
        ...
    }

    await childrenTask;

    return 1;
}

これは、タスクが完了するとすぐに縮小するタスクのリンクリストであることに注意してください。

于 2015-02-01T23:32:39.147 に答える