2009-01-16 47 views
1

你如何设计一个支持取消操作的方法/类?提供支持取消的方法/类/组件的最佳做法是什么?

我意识到我从来没有以一致的方式做到这一点,我想改变这一点。

一些我所使用过的东西:

  • 在类的布尔属性IsCancelled,我在内部同步。有时我有一个CanCancel属性,如果操作无法在任何给定时间取消
  • 传递一个Func < bool>委托,我反复调用以查看操作是否已被取消。
  • 手动终止线程 - 虽然这肯定是不好的做法

通常你如何做到这一点?

回答

1

我宁愿使用IsCancelled财产的想法。你的后台线程方法可以在适当的时候检查它,根据需要进行任何清理,并终止操作。如果在线程完成时使用回调方法,则很容易检查属性并查看它是否有效。我曾经使用过使用这个策略的框架工作线程类,它运行良好。

+0

你曾经为单一方法而不是类实现这个吗? 与IsCancelled的事情是,我不断重新实现,我需要它的每一个类。对于这种事情有一个单独的实现是很好的。 – 2009-01-16 02:30:39

1

回到用例:你试图提供什么样的行为?如果你有一个你想取消的异步操作,那么你可能最好的实现一个方法,让你通过一个标志或一个信号通知另一个线程。发送信号是引起注意的一个好方法,但我没有看过C#处理信号的方法。如果您需要能够取消和撤消,Command模式派上用场。

1

我会去CancellationTokenSource并使用其相关的CancellationToken 作为信号消除的手段。这是.Net Framework v4中的新功能。

概念是,CancellationTokenSource只需调用取消,您的代码就可以共享CancellationToken,您可以在其上定期检查其中的IsCancellationRequested属性。在紧密循环或更长时间运行的操作中尤其如此,以便让代码及时停止。

的额外的好处是,即使阻塞阻止由于等待线程上的SemaphoreSlimManualResetEventSlim可以用信号正常退出,因为这些类接受CancellationToken在其Wait方法在.Net框架V4

例如看看:ManualResetEventSlim.Wait有过载接受CancellationToken

相关问题