2013-03-15 63 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