如何在一段时间后取消某个功能?
问题描述:
我想知道如何在一定时间后取消某个功能!如何在一段时间后取消某个功能?
例如,我该如何取消这个功能?
private async Task function()
{
try
{
while (true)
{
//mycode
}
}
catch{ }
}
答
你可以使用Timer类,启动它,当你想让它(节目的开始大概),并使用一些像一个简单的if语句来阻止它,如*如果定时器高于设定更大时间,结束节目。 *
答
前段时间我面临同样的问题,发现一个很好的解决方案为我工作。我通过这种方式通过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将查看正常异步任务或延迟任务是否先完成。如果是延迟的,那么您的最大时间已经过期并引发异常。
问候 康斯坦丁
答
我添加小例子
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 { }
}
答
我怎么能取消这个功能呢?
通常情况下,awaitable方法将采取CancellationToken
,所以你只是把它传递通过:
private async Task functionAsync(CancellationToken cancellationToken)
{
while (true)
{
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); //mycode
}
}
您已经标记了用'CancellationTokenSource'的问题 - 所以传递的CancellationToken进入功能,并在循环的每次迭代中检查它是否已被请求取消,即'while(!cancellationToken.IsCancellationRequested){...' – stuartd