使异步代码可取消
本文关键字:可取消 代码 异步 | 更新日期: 2023-09-27 18:04:22
我有一些耗时的方法:
public class TimeConsumingClass
{
public void TimeConsumingMethod()
{
//let's imagine my method works this way
for (var i = 0; i < 10000; i++)
Thread.Sleep();
}
}
先前在主线程中执行过。然后我需要在次线程中调用它,以避免阻塞UI:
Task.Factory.StartNew(() => { new TimeConsumingClass().TimeConsumingMethod(); });
现在我需要使它能够随时停止这个方法。我想让我的方法处理CancellationToken同时我想保持同步调用这个方法的可能性(没有CancellationToken)。我想到的最好的主意是将可选的CancellationToken参数添加到我的方法中,该方法默认为空(对于同步调用):
public class TimeConsumingClass
{
public void TimeConsumingMethod(CancellationToken cancellationToken = null)
{
//let's imagine my method works this way
for (var i = 0; i < 10000; i++)
{
if (cancellationToken.IsCancellationRequested)
return;
Thread.Sleep();
}
}
}
但是最近在。net多线程方面有很多创新,我有一种感觉,这是一个更好的方法来做我将要做的事情。有吗?
如果您正在寻找一种更"现代"的方法来实现它,您最好的选择是研究c#中新的async
和await
关键字。它们是迄今为止实现异步性最直接的方法。
你可以在这里找到async
和await
的很好的介绍:
Async和Await异步编程(c#和Visual Basic)
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
要了解如何报告进度和取消异步方法,请阅读此处:
Async in 4.5:在异步api中启用进度和取消
http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis.aspx
要取消与您在问题中使用的代码相同样式的任务,请查看这里:
任务取消
http://msdn.microsoft.com/en-us/library/dd997396.aspx