3

我有一些耗时的方法:

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

4

1 回答 1

3

如果您正在寻找一种更“现代”的方式来做到这一点,最好的办法是研究 c# 中的 newasyncawait关键字。它们是迄今为止实现异步性的最直接的方法。

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

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

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

于 2013-03-15T17:54:22.677 回答