2016-09-15 96 views
1

我想知道如何在一定時間後取消某個功能!如何在一段時間後取消某個功能?

例如,我該如何取消這個功能?

private async Task function() 
    { 
     try 
     { 
      while (true) 
      { 
       //mycode 
      } 
     } 
     catch{ } 
    } 
+2

您已經標記了用'CancellationTokenSource'的問題 - 所以傳遞的CancellationToken進入功能,並在循環的每次迭代中檢查它是否已被請求取消,即'while(!cancellationToken.IsCancellationRequested){...' – stuartd

回答

1

你可以使用Timer類,啓動它,當你想讓它(節目的開始大概),並使用一些像一個簡單的if語句來阻止它,如*如果定時器高於設定更大時間,結束節目。 *

2

前段時間我面臨同樣的問題,發現一個很好的解決方案爲我工作。我通過這種方式通過wcf將異步調用分離到另一個服務(請參閱下面的代碼):

您可以將CancellationToken與第二個任務組合使用,與您的運行任務並行運行

private const int TimeOut = 50000; 

    public static async Task<T> HandleServiceCall<T>(Func<Task<T>> doServiceCall, CancellationTokenSource source) where T : class 
    { 
     var delaySource = new CancellationTokenSource(TimeSpan.FromSeconds(50)); 
     source.Token.ThrowIfCancellationRequested(); 

     var res = doServiceCall(); 

     if (await Task.WhenAny(res, Task.Delay(TimeSpan.FromMilliseconds(TimeOut), delaySource.Token)) == res) 
     { 
      delaySource.Cancel(); 
      await res; 
     } 
     else 
     { 
      source.Cancel(); 
      throw new Exception("Your Text"); 
     } 

     return await res; 
    } 

您可以調用此方法例如這樣:

var source = new CancellationTokenSource(TimeSpan.FromSeconds(50)); 
    source.Token.ThrowIfCancellationRequested(); 
    MyWrapperClass.HandleServiceCall(async() => await MyAsyncMethod(source.Token), source).Result 

爲了澄清這到底是怎麼做:如果需要取消它 我創建一個取消標記爲我的任務與給定最大TimeSpan然後將此令牌賦予應該調用的異步方法。 這個調用是作爲一個func給我的HandleServiceCall方法。 此方法將創建另一個具有給定較大時間跨度的CancellationToken,該時間跨度將作爲延遲任務運行(task.Delay將等待,直到令牌被觸發)。 Task.WhenAny將查看正常異步任務或延遲任務是否先完成。如果是延遲的,那麼您的最大時間已經過期並引發異常。

問候 康斯坦丁

1

我添加小例子

static CancellationTokenSource cts; 
    static void Main(string[] args) 
    { 
     cts = new CancellationTokenSource(); 
     Task.Factory.StartNew(test); 
     cts.Cancel(); 
    } 

    private async static void test() 
    { 

     await function(cts.Token); 

    } 

    static async Task function(CancellationToken ct) 
    { 
     try 
     { 
      while (!ct.IsCancellationRequested) 
      { 
       Thread.Sleep(1000); 

       //mycode 
      } 
     } 
     catch { } 
    } 
2

我怎麼能取消這個功能呢?

通常情況下,awaitable方法將採取CancellationToken,所以你只是把它傳遞通過:

private async Task functionAsync(CancellationToken cancellationToken) 
{ 
    while (true) 
    { 
    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); //mycode 
    } 
} 
相關問題