在两个同步任务之间捕获取消按钮单击
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()
它将进入数据库并每次读取该值。
缺点是性能,但你想要不可能的事情,所以你必须用这样的解决方法来解决...
您可以创建自己的实现,只是给您一个想法。
我有一个任务列表 运行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()
它将进入数据库并每次读取该值。
缺点是性能,但你想要不可能的事情,所以你必须用这样的解决方法来解决...
您可以创建自己的实现,只是给您一个想法。