提供支持取消的方法/类/组件的最佳实践是什么?

时间:2009-01-16 01:57:58

标签: c# design-patterns

如何设计一个应该支持取消操作的方法/类?

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

我使用过的一些东西:

  • 我在内部同步的类IsCancelled上的布尔属性。如果在任何给定时间无法取消操作,有时我会有CanCancel属性
  • 传递一个Func< bool>委托我多次打电话来查看操作是否已被取消。
  • 手动终止线程 - 虽然这绝对是不好的做法

你通常如何做到这一点?

3 个答案:

答案 0 :(得分:1)

我更喜欢使用IsCancelled属性的想法。您的后台线程方法可以在适当的时间检查它,根据需要进行任何清理,并终止操作。如果您在线程完成时使用回调方法,则可以轻松检查属性并查看它是否有效。我曾经使用过过去使用过这种策略的框架工作者线程类,而且效果很好。

答案 1 :(得分:1)

回到用例:您尝试提供的行为是什么?如果您要取消异步操作,那么您可能最好实现一种方法,该方法允许您通过标志或信号量通知另一个线程。虽然我没有研究C#对信号的处理,但发送信号是引起注意的好方法。如果您需要能够取消和撤消,Command模式就派上用场了。

答案 2 :(得分:1)

我会选择CancellationTokenSource并使用其关联的CancellationToken 作为信令取消的手段。这是.Net Framework v4中的新功能。

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

额外的好处是,即使被阻止的线程因SemaphoreSlim上的等待而被阻止,ManualResetEventSlim也可以发出信号以正常退出,因为这些类在CancellationToken中接受了Wait .Net Framework v4中的方法

例如,请查看:ManualResetEventSlim.Wait,其重载接受CancellationToken