1

以前は、ループ タスクを作成すると、最初は完全に実行され、タイミングの問題が原因で失敗していました。たとえば、ある個々のタスクの関数が、そのタスクの前に来るようにプログラムされていたとしても、別のタスクよりも速く実行を開始するなどでした。

したがって、遅延(時間)が終了したらタスクのイベントを繰り返す方法を理解するという私の考えは、私の頭の中で次のようになります。

private async Task programCore()
{
    int n = 1000;
    for (int i = 0; i < n; )
    {
         FirstThing(); 
         await Task.Delay(2100);

         SecondThing();
         await Task.Delay(2200);

         ThirdThing();
         await Task.Delay(2300);
    }
////////////////////////////////////////////////////////////////////////////

    else if (programCore.TasksHaveAllTimedOut) // Idealistic code.
    {
        programCore.Restart();
    }
}

このようなことは可能ですか?そうでない場合、それを行うより良い方法はありますか?

4

2 に答える 2

5

@CodingGorilla の考えは正しいと思います。コードは次のようになります (CancellationTokenタイムアウトに s を使用)。

private async Task programCore()
{
  int n = 1000;
  for (int i = 0; i < n; ++i)
  {
    var timeout1 = new CancellationTokenSource(2100);
    await FirstThingAsync(timeout1.Token);

    var timeout2 = new CancellationTokenSource(2200);
    await SecondThingAsync(timeout2.Token);

    var timeout2 = new CancellationTokenSource(2300);
    await ThirdThingAsync(timeout3.Token);
  }
}

上記のコードは、いずれかのタスクがタイムアウトを超えた場合に例外を発生させますが、これはまさにあなたが望むものではないかもしれません. OperationCanceledExceptionこれを別の方法で処理したい場合は、 をキャッチできます。

于 2013-06-13T18:12:41.380 に答える