2013-03-15 98 views
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多线程创新的最近,我有感觉这是一个更好的方式去做我将要做的事情。有一个吗?

+1

不知道工作量是* *实际上**由Thread_Sleep表示,这是一个最佳解决方案。 – spender 2013-03-15 17:50:06

+0

你的问题是关于使*异步*代码可以取消......但这看起来完全与我同步。你能澄清一下吗? – 2013-03-15 17:50:16

+0

@JonSkeet,异步我的意思是我的代码在非主线程 – SiberianGuy 2013-03-15 17:52:05

回答

3

如果你正在寻找更现代化的方式来做到这一点,你最好的选择是研究c#中的新关键字asyncawait。它们是实现异步性的最直接的方式。

你可以找到一个很好的介绍asyncawait这里:

异步编程与异步和等待(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