异步操作的非协作取消

本文关键字:取消 协作 异步操作 | 更新日期: 2023-09-27 18:27:42

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

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

异步操作的非协作取消

我认为您有三种选择。

第一,将计算融入自己的线程中。这将使UI保持响应。不用取消按钮,只需让用户知道,一旦盯上,将要采取的行动就无法停止。

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

第三,将计算放入自己的appdomain/进程中。如果需要,终止外部进程。


每一个都有好的和坏的。

嗯?只需使用Thread和worker方法。

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

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