使异步代码可取消

时间:2013-03-15 17:47:25

标签: c# .net multithreading

我有一些耗时的方法:

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多线程有很多创新,我觉得这是一个更好的方法来做我将要做的事情。有吗?

1 个答案:

答案 0 :(得分:3)

如果您正在寻找更“现代”的方式,最好的办法是研究c#中新的asyncawait个关键字。它们是迄今为止实现异步性最直接的方式。

您可以在此处找到asyncawait的良好介绍:

使用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

要使用您在问题中使用的相同代码样式取消任务,请查看此处:

取消任务
http://msdn.microsoft.com/en-us/library/dd997396.aspx