2012-03-12 51 views
3

在我的Windows窗体应用程序中,我需要调用第三方数学库(Accord.NET)的长时间运行操作。在计算过程中,我希望保持GUI响应,并且让用户可以取消长时间运行。非合作取消异步操作

有没有办法在后台线程中执行该函数,并给予用户取消它的可能性?请注意,我想调用的长时间运行函数位于外部库中,并且不接受CancellationToken(否则,例如,我可以很容易地使用ThreadPoolQueueUserWorkItem)。所以我正在寻找一种非合作取消操作的方式。

+0

为什么你不使用托管线程? – Candide 2012-03-12 13:07:42

+4

唯一安全的方法是通过在单独的AppDomain中运行该代码。 – 2012-03-12 13:11:18

+0

@HenkHolterman:你有一个如何在单独的AppDomain中执行函数的例子吗?我想在创建和销毁一个新的AppDomain时会有相当多的开销? – 2012-03-12 13:40:10

回答

3

我想说你有三种选择。

一,将计算转入它自己的线程。这将保持UI的响应。取而代之的是取消按钮,只需让用户知道即将采取的行动无法停止一旦凝视。

二,将计算转入它自己的线程,就像上面一样;然而,假装通过简单地减少线程优先级来取消它。您可以继续进行计算,但只需停止主线程中的报告进度即可。完成后只需扔掉结果。

三,把计算放到它自己的appdomain/process中。如果需要,请杀死该外部进程。


每个人都有好的和坏的东西。

+1

+1对孤儿线索的建议,挨饿,让它死亡,孤独,忽视,没有人哀悼它,没有悼词,没有墓志铭(抽泣..) – 2012-03-12 13:41:10

+0

@MartinJames:;)一些老MötleyCrüe歌词在这样的情况下浮现在脑海:不要离开疯狂,离开... – NotMe 2012-03-12 13:53:13

+0

Smilin'通过痛苦.. – 2012-03-12 16:07:47

1

呵呵?只需使用一个线程和一个工作者方法。

Thread thread = new Thread(MyWorkerMethod); 
thread.Start(); 

thread.Abort(); 


void MyWorkerMethod() { 
    // do anything you want in here 
} 
+1

首先阅读Thread.Abort()。这被认为是不安全的。 – 2012-03-12 13:15:04

+0

如果他使用受保护的代码块(例如catch-block)。在任何其他情况下都不应该有问题。或者我想念什么? – ChrisB 2012-03-12 13:18:49

+0

它看起来像我错过了最明显的解决方案...... :)感谢@ChrisB指出了这一点。 – 2012-03-12 13:31:55