在我的Windows窗体应用程序中,我需要调用第三方数学库(Accord.NET)的长期运行操作。在计算过程中,我希望保持我的GUI响应,并让用户可以取消长时间运行。
有没有办法在后台线程中执行该函数并让用户取消它?请注意,我要调用的长时间运行的函数位于外部库中,并且不接受CancellationToken
(否则我可以轻松使用ThreadPool
的{{1}},例如) 。所以我正在寻找一种非合作取消操作的方法。
答案 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
}