使异步代码可取消

3

我有一些耗时的方法:

public class TimeConsumingClass
{
   public void TimeConsumingMethod()
   {
      //let's imagine my method works this way
      for (var i = 0; i < 10000; i++)
         Thread.Sleep();
   }
}

之前它在主线程中执行。现在我需要在辅助线程中调用它,以免阻塞用户界面:

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多线程方面有许多创新,我感觉有更好的方法来完成我要做的事情。是否有一种方法呢?


2
不知道 Thread.Sleep 实际代表的工作负载,这是一种最优解决方案。 - spender
你的问题涉及到如何使异步代码可取消...但是在我看来,这完全是同步的。你能否澄清一下? - Jon Skeet
@JonSkeet,通过异步,我指的是我的代码在非主线程中执行。 - SiberianGuy
@spender,有哪些工作负载细节可能会改变答案?我可以提供一些 :) - SiberianGuy
@JonSkeet,我同意,但我没有想到更好的问题标题。 - SiberianGuy
显示剩余2条评论
1个回答

3
如果您正在寻找一种更“现代”的实现方式,最好的方法是学习c#中的新关键字asyncawait,它们是实现异步性最直接的方法。
您可以在这里找到关于 asyncawait 的很好的介绍: 使用 Async 和 Await 进行异步编程 (C# 和 Visual Basic) http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx 要了解如何汇报进度和取消异步方法,请阅读以下内容: 4.5 中的 Async:启用异步 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接