2016-09-15 94 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 
    } 
} 
相关问题