簡體   English   中英

c#如何確保任務完成

[英]How to make sure a task is completed in c#

我需要執行這樣的任務(我無法控制該任務的源代碼)

public Task DoSomething()

有時該任務未能完成。 並且此方法不會引發任何異常。 在這種情況下,我想再次執行該任務,直到它完成。 為此,我嘗試這樣做:

Task task;
do {
    task = Task.Run(async () => await DoSomething();
    await Task.Delay(300);
}
while (!task.IsCompleted);

這是正確的嗎 ? 有沒有更好的方法?

您應該直接使用await調用異步方法。

如果出現錯誤,應該拋出異常。

你的代碼應該變成這樣。

bool repeat = false;
do {
    try 
    { 
        await DoSomething(); 
        repeat = false;
    }
    catch
    {
        repeat = true;
    }
    if (repeat)
        await Task.Delay(300); 
}
while (repeat); // better with some kind of timeout or attempts counter...

此外, IsCompleted還包括FaultedCancelled 如果您想使用您的方法,您需要使用新屬性IsCompletedSuccessfully或排除IsFaultIsCancelled (如果您使用舊的 .NET fwk)。

您可能想要這樣的東西:

  // Trying to complete task again and again... 
  // you may want to give some number of attempt to complete, say 
  // for (int attempt = 1; attempt <= 3; ++i) {
  while (true) {
    // Let task 300 ms to completet before it'll be canceled
    using (CancellationTokenSource cts = new CancellationTokenSource(300)) {
      try {
        await DoSomething(cts.Token);

        // Task Succeeded, break the loop
        break;
      }
      catch (TaskCanceledException) {
        // Task Cancelled, keep on looping
        ;
      }
    }
  }

請注意,您應該在DoSomething獲得一些支持

   async Task DoSomething(CancellationToken token)

代替

   async Task DoSomething()

因為我們應該知道如何取消它。 如果你沒有

   async Task DoSomething(CancellationToken token)

或類似的簽名,(使用CancellationToken ),殘酷的事實是你不能取消 您可以嘗試等待(如果任務未完成,則忘記該任務):

   // Since we are going to forget running tasks, let's
   // restrict number of attempts 
   for (int attempt = 1; attempt <= 3; ++attempt) {
     Task task = DoSomething();

     if (await Task.WhenAny(task, Task.Delay(300)) == task) {
       // task has been completed before timeout
       break;
     } 

     // we forget task (alas, we can't cancel it) and try again
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM