我正在使用异步方法。当Timer引发超时事件时,如何停止执行?
我的代码:
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();
}
答案 0 :(得分: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
的方法,因此您无法安全地取消此任务。你必须让线程/任务继续完成。
答案 1 :(得分:0)
我认为您可以尝试提及何时取消它。像
这样的东西cts.CancelAfter(TimeSpan.FromMilliseconds(5000));
此外,您需要在被调用的方法中使用取消令牌。那时候你会知道什么时候取消。