我可以通过C#中的代理取消方法吗?

时间:2009-09-11 10:43:23

标签: c# delegates

如果我在“处理”动画屏幕中按取消,我想立即停止一个方法。我通过代理使用异步调用。是否可以通过委托立即停止执行该方法?

谢谢:)

3 个答案:

答案 0 :(得分:9)

不 - 至少,不干净。 (我不包括Thread.Abort为“干净”。)你应该做的是有一种机制告诉代表你尝试取消它。然后,您的代表需要偶尔检查取消标记并做出相应的反应。

Parallel Extensions已经在整个地方内置了取消(特别是取消令牌,只允许适当的代码段取消任务)。据我所知,它仍然是合作的。强制取消将永远存在腐败状态的风险。

答案 1 :(得分:5)

您可以使用System.ComponentModel.BackgroundWorker。它支持取消,因此您不必编写样板代码。客户端代码可以简单地调用CancelAsyn方法,您可以在代码中检查CancellationPending属性,以确定客户端是否已取消操作并进行挽救。

答案 2 :(得分:1)

正如乔恩已经说过的那样,你无法告诉一个主题:“请立即停止”,并期待线程服从。 Thread.Abort不会告诉它停止,只需“拔掉”它。 :)

我过去所做的是在线程代码中添加一系列“if(wehavetostop)”,如果用户按下“取消”,我将wehavetostop == true。

它不是太优雅,在某些情况下,“if”检查可能“很难”,特别是如果你的线程运行一个你不能分割的“长”操作。

如果您正在尝试建立网络连接(并且花费时间)并且您确实认为线程的“异常”终止不会导致任何损坏状态,您可以使用它,但请记住您不能信任该线程涉及的事物的状态。