我有一些耗时的方法:
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参数,默认情况下为null(对于同步调用):
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多线程有很多创新,我觉得这是一个更好的方法来做我将要做的事情。有吗?
答案 0 :(得分:3)
如果您正在寻找更“现代”的方式,最好的办法是研究c#中新的async
和await
个关键字。它们是迄今为止实现异步性最直接的方式。
您可以在此处找到async
和await
的良好介绍:
使用Async和Await进行异步编程(C#和Visual Basic)
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
要了解如何报告进度并取消异步方法,请阅读:
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
要使用您在问题中使用的相同代码样式取消任务,请查看此处: