如何设计一个应该支持取消操作的方法/类?
我意识到我从来没有以一致的方式做到这一点,我想改变它。
我使用过的一些东西:
你通常如何做到这一点?
答案 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
。