在我的Windows窗体应用程序中,我需要调用第三方数学库(Accord.NET)的长时间运行操作。在计算过程中,我希望保持GUI响应,并且让用户可以取消长时间运行。非合作取消异步操作
有没有办法在后台线程中执行该函数,并给予用户取消它的可能性?请注意,我想调用的长时间运行函数位于外部库中,并且不接受CancellationToken
(否则,例如,我可以很容易地使用ThreadPool
的QueueUserWorkItem
)。所以我正在寻找一种非合作取消操作的方式。
在我的Windows窗体应用程序中,我需要调用第三方数学库(Accord.NET)的长时间运行操作。在计算过程中,我希望保持GUI响应,并且让用户可以取消长时间运行。非合作取消异步操作
有没有办法在后台线程中执行该函数,并给予用户取消它的可能性?请注意,我想调用的长时间运行函数位于外部库中,并且不接受CancellationToken
(否则,例如,我可以很容易地使用ThreadPool
的QueueUserWorkItem
)。所以我正在寻找一种非合作取消操作的方式。
我想说你有三种选择。
一,将计算转入它自己的线程。这将保持UI的响应。取而代之的是取消按钮,只需让用户知道即将采取的行动无法停止一旦凝视。
二,将计算转入它自己的线程,就像上面一样;然而,假装通过简单地减少线程优先级来取消它。您可以继续进行计算,但只需停止主线程中的报告进度即可。完成后只需扔掉结果。
三,把计算放到它自己的appdomain/process中。如果需要,请杀死该外部进程。
每个人都有好的和坏的东西。
+1对孤儿线索的建议,挨饿,让它死亡,孤独,忽视,没有人哀悼它,没有悼词,没有墓志铭(抽泣..) – 2012-03-12 13:41:10
@MartinJames:;)一些老MötleyCrüe歌词在这样的情况下浮现在脑海:不要离开疯狂,离开... – NotMe 2012-03-12 13:53:13
Smilin'通过痛苦.. – 2012-03-12 16:07:47
呵呵?只需使用一个线程和一个工作者方法。
Thread thread = new Thread(MyWorkerMethod);
thread.Start();
thread.Abort();
void MyWorkerMethod() {
// do anything you want in here
}
首先阅读Thread.Abort()。这被认为是不安全的。 – 2012-03-12 13:15:04
如果他使用受保护的代码块(例如catch-block)。在任何其他情况下都不应该有问题。或者我想念什么? – ChrisB 2012-03-12 13:18:49
它看起来像我错过了最明显的解决方案...... :)感谢@ChrisB指出了这一点。 – 2012-03-12 13:31:55
为什么你不使用托管线程? – Candide 2012-03-12 13:07:42
唯一安全的方法是通过在单独的AppDomain中运行该代码。 – 2012-03-12 13:11:18
@HenkHolterman:你有一个如何在单独的AppDomain中执行函数的例子吗?我想在创建和销毁一个新的AppDomain时会有相当多的开销? – 2012-03-12 13:40:10