2014-09-28 139 views
-1

我正在更新我的代碼以使用Async,問題在於Timer.Elapsed需要void返回類型,但這基本上不允許等待,因此代碼不會等待在完成所有事情之前,過早完成。Async with a Timer

代碼:

public static void Main(string[] args) 
{ 
    Timer timer; 

    timer = new System.Timers.Timer(); 
    timer.Interval = 3000; 
    timer.Elapsed += OnTimerAsync; 
    timer.Enabled = true; 
    timer.Start(); 

    Console.WriteLine("Press the Enter key to exit the program... "); 
    Console.ReadLine(); 
    Console.WriteLine("Terminating the application..."); 
} 

public async static void OnTimerAsync(object sender, ElapsedEventArgs args) 
{ 
    await ExecuteWorkflowAsync(); 
} 

private async static Task<bool> ExecuteWorkflowAsync() 
{ 
    List<Schedule> schedulesToRun; 

    try 
    { 
     await JobLoader.LoadAsync(schedulesToRun); 
    } 
    catch (Exception ex) 
    { 
     // Log ex 
    } 

    return true; 
} 

是否有使用與異步Timer對象的方法嗎?

+2

究竟是太快整理? – SLaks 2014-09-28 16:19:21

+1

BTW,timer.Enabled = true;和timer.Start();做同樣的事。 – 2014-09-28 16:27:48

+2

目前還不清楚你的意思是「太快結束」。你的代碼看起來很好。 – 2014-09-28 16:44:21

回答

0

試試這個:

public async static void OnTimerAsync(object sender, ElapsedEventArgs args) 
{ 
    timer.Enabled = false; 
    await ExecuteWorkflowAsync(); 
    timer.Enabled = true; 
} 
+0

不幸的是,它仍然沒有等待。我想我要放棄計時器,並在循環中使用Task.Delay來替換計時器。 – Josh 2014-09-28 21:28:14