【发布时间】:2021-12-16 20:10:42
【问题描述】:
我有一个正在运行的任务列表,并希望在带有取消按钮的 (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 时捕捉鼠标单击“取消”按钮。
【问题讨论】:
-
执行的代码是什么?是 1 行代码长时间执行还是一个循环或多行代码?如果它是循环或多行并且您找不到合适的方法来执行此操作,则快速而肮脏的方法是添加一个布尔值,在取消单击时将其设置为 true 并检查循环内部 if(cancel == true) break; (或返回您的代码)
-
这是我的意图,参见上面的编辑。我不知道如何点击按钮将
Cancelled设置为true -
“任务不能在单独的线程上运行”——这使得提供良好的用户体验变得非常困难。您也许可以显式运行消息循环,但您需要每 50 毫秒左右执行一次,这对我来说听起来像是一个糟糕的解决方案。为什么会有这样的要求?
-
IStep的操作是在一个数据库上进行的,绝对不能处理多次访问。除了在主线程上执行操作外,没有办法阻止主线程随机启动访问。但是,我可能能够在侧线程上启动进度表单并通过主线程对其进行更新(这与通常的方式相反,但我想这很好)。作为初学者,我现在已经删除了取消按钮。 (; -
@st_stefanov 但是这个click_event只有在我的循环完成后才会执行,不是吗?