2017-09-14 15 views
0

私は並列に開始する複数のSystem.Threading.Timerを持っています。結局、私はすべてのタスクが完了するまで待つためにTask.Waitを持っています。しかし、それはすべてを待たずに、どうすればそれをすべて待つことができますか?すべてのタイマータスクが完了するのを待つ方法は?

private List<Task> todayTasks = new List<Task>(); 

foreach (var item in todayReport) 
{ 
    todayTasks.Add(SetupTimer(item.Exec_Time, item.Report_Id));    
} 

Task.WaitAll(todayTasks.ToArray()); 

--SetupTimer--

private Task SetupTimer(DateTime alertTime, int id) 
{ 
    DateTime current = DateTime.Now; 
    TimeSpan timeToGo = alertTime.TimeOfDay - current.TimeOfDay; 

    if (timeToGo < TimeSpan.Zero) { 
     //TODO: ERROR time already passed 
    } 

    ExecCustomReportService executeCustom = new ExecCustomReportService(); 

    return Task.Run(
     () => new Timer(
      x => executeCustom.AdhockReport(id), null, timeToGo, Timeout.InfiniteTimeSpan 
     ) 
    ); 
} 
+0

は、なぜあなたは '簡単なTask'sをタイマーを使用していませんか? – Sinatr

+3

'Task.Run'に与えられた' Action'は単に 'Timer'オブジェクトを構築します。したがって、 'Timer'が構築されるとすぐに、タスクは完了します。 –

+0

@ YacoubMassadそれはかなりの質問に対する答えです。 –

答えて

-1

コメントに@ YacoubMassadが記載されているため、あなたのタスクは単にタイマーを作成して戻ります。

あなたはタイマーを取り除くとTask.Delay使用しますされて何ができるか:

return Task.Delay(timeToGo).ContinueWith(t=> executeCustom.AdhockReport(id)); 
+0

うーん...この投稿はなぜ投票されたのですか? –

0

あなたは仕事に適しているツールを使用してオフには本当に良くしています。 MicrosoftのReactive Framework(Rx)をお勧めします。次に、これを行うことができます:

var query = 
    from item in todayReport.ToObservable() 
    from report in Observable.Start(() => executeCustom.AdhockReport(item.Report_Id)) 
    select report; 

IDisposable subscription = 
    query 
     .Subscribe(
      report => 
      { 
       /* Do something with each report */ 
      }, 
      () => 
      { 
       /* Do something when finished */ 
      }); 

NuGet "System.Reactive"するだけです。

関連する問題