非协作取消异步操作

时间:2012-03-12 13:04:20

标签: c# multithreading asynchronous

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

有没有办法在后台线程中执行该函数并让用户取消它?请注意,我要调用的长时间运行的函数位于外部库中,并且不接受CancellationToken(否则我可以轻松使用ThreadPool的{​​{1}},例如) 。所以我正在寻找一种非合作取消操作的方法。

2 个答案:

答案 0 :(得分:3)

我说你有三个选择。

一,将计算旋转到自己的线程中。这将使UI保持响应。而不是取消按钮,只需让用户知道即将开始采取的行动就不能停止。

二,将计算旋转到它自己的线程中,如上所述;但是,假装通过简单地减少线程优先级来取消它。您可以让计算继续进行,但只是停止报告主线程中的进度。完成后只需扔掉结果。

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


每个人都有好事和坏事。

答案 1 :(得分:1)

是吗?只需使用Thread和worker方法。

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

thread.Abort();


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