在两个同步任务之间捕获取消按钮单击

Catching cancel button click between two synchronous tasks

我有一个任务列表 运行ning 并且想在带有“取消”按钮的 (WinForms) 表单中显示进度。

我知道,有几个 async 选项,但我有两个限制:任务不能 运行 在单独的线程上,解决方案必须与 .NET 3.5 兼容(它是程序的插件,我无权访问)。

没关系,如果一个任务在取消生效之前完成。所以我想知道,是否有机会检查同步代码,是否在执行某些任务时发生鼠标单击按钮?

编辑:这是预期的代码:

foreach (IStep step in Steps)
{
    if (Cancelled)
        return;
    step.Run();
    ReportProgress(100.0 * completedWeight / totalWeight, step.Description);
    completedWeight += step.Weight;
}

ReportProgress(100, "Completed");

所以 IStep 包含一个 Run() 方法,我完全可以在取消前完成一个步骤。我不知道如何在执行某些步骤将 Cancelled 设置为 true 时捕获鼠标单击“取消”按钮。

显然这里没有“标准”解决方案,所以我们必须跳出框框思考...

假设您有自己的应用程序(AddIn 或其他无关紧要)并且您无法通过按钮控制循环。

你read/write到数据库。

在你的循环之上,上面写着:

if (Cancelled)
        return;

我们必须替换为:

If(CheckIsCancelled())

你必须找到一种方法来制作一个可以点击的按钮,可以是当前按钮附近的另一个表单,但它必须能够 运行 独立于被你的循环阻止的当前表单.

在某种 Config/Util table 中创建数据库参数。 例如。 CancelMyLoop - Bit

单击该按钮 - 将参数值设置为 true

然后回到方法:CheckIsCancelled() 它将进入数据库并每次读取该值。

缺点是性能,但你想要不可能的事情,所以你必须用这样的解决方法来解决...

您可以创建自己的实现,只是给您一个想法。