2017-02-04 92 views
-4

我正在使用異步方法。如何在Timer引發超時事件時停止執行?如何停止c#中的異步方法執行?

我的代碼:

public async Task<object> Method() 
{ 
    cts = new CancellationTokenSource(); 
    try 
    { 
     timer = new System.Timers.Timer(3000); 
     timer.Start(); 
     timer.Elapsed += (sender, e) => 
     { 
      try 
      { 
       timer_Elapsed(sender, e, cts.Token, thread); 
      } 
      catch (OperationCanceledException) 
      { 
       return; 
      } 
      catch (Exception ex) 
      { 
       return; 
      } 
     }; 
     await methodAsync(cts.Token); 
     return "message"; 
    } 
    catch (OperationCanceledException) 
    { 
     return "cancelled"; 
    } 
    catch (Exception ex) 
    { 
     return ex.Message; 
    } 
} 

// Async Call 
public async Task<object> methodAsync(CancellationToken ct) 
{ 
    try 
    { 
     pdfDocument = htmlConverter.Convert("path", ""); 
    } 
    catch(Exception ex) 
    { 
     return x.Message; 
    } 
} 

// Timer event 
void timer_Elapsed(object sender, ElapsedEventArgs e, CancellationToken ct) 
{ 
    cts.Cancel(); 
    ct.ThrowIfCancellationRequested(); 
} 
+2

您似乎試圖取消代碼'htmlConverter.Convert(「path」,「」)''。無法取消此代碼,因爲取消代碼必須能夠響應取消令牌。所以唯一的答案是,如果你需要取消,你需要啓動一個新的進程並殺死它。否則唯一安全的行爲是讓這段代碼運行完成。 – Enigmativity

+0

我不想取消這個'pdfDocument = htmlConverter.Convert(「path」,「」);'code。 只要嘗試殺死methodAsync()函數。 有什麼辦法嗎? –

+0

'methodAsync'函數中唯一發生的事情就是調用'.Convert',所以停止一個和停止另一個是一樣的。您無法安全地強制任務/線程取消。您必須能夠響應取消令牌才能正常工作。 – Enigmativity

回答

0

我想你可以嘗試提何時取消它。類似於

cts.CancelAfter(TimeSpan.FromMilliseconds(5000)); 

另外,您需要在被調用方法中使用取消標記。那時你會知道何時取消。

1

下面介紹如何取消任務的工作原理:

public async Task<object> Method() 
{ 
    cts = new CancellationTokenSource(); 
    await methodAsync(cts.Token); 
    return "message"; 
} 

public Task<object> methodAsync(CancellationToken ct) 
{ 
    for (var i = 0; i < 1000000; i++) 
    { 
     if (ct.IsCancellationRequested) 
     { 
      break; 
     } 
     //Do a small part of the overall task based on `i` 
    } 
    return result; 
} 

你必須在的ct.IsCancellationRequested屬性的變化,知道什麼時候取消任務作出迴應。一個線程/任務取消另一個線程/任務沒有安全的方法。

在你的情況下,你似乎試圖調用一個不知道CancellationToken的方法,所以你不能安全地取消這個任務。您必須讓線程/任務繼續完成。