尝试2号.尝试保持清晰,因为我在这项任务上的工作时间比我应该做的要长得多,并且进展甚微.
我需要为应用程序制作进度条.现在,所有事情都在一个UI线程中发生,所有的处理都没发生,因此,当我单击按钮后执行长时间运行的过程时,该程序挂起大约40秒钟,然后继续输出(我无法更改该设置)部分,申请已交给我).而且我还必须创建一个“取消”按钮,因此,如果在中间过程中被击中,则在完成该过程后,它会检查“取消”标志,如果它为ON,请退出所有方法并返回初始位置.
我要做的是为此过程制作进度条.其中两个,一个用于中间过程,一个用于总计.中间是一个小动作,例如DB调用,输出中间过程(for和foreach循环).
我试过将这些条放在相同的UI窗口中,并在进行操作时在同一线程中对其进行更新(找到要点,从那里开始进度条,并根据我的判断增加它们,然后循环).那只是在给UI加载更多的东西,但是还在工作(进度条动摇).
然后我尝试使用后台工作者.同样,将这些条放在UI中并通过后台工作程序运行它们.即使BG工作程序运行,该问题也必须在正在处理贪婪请求的UI窗口中进行,所以我不希望它更新.
我尝试在核心上使用多线程(没有BG工作者),并在新线程中创建一个新表单以反映进度,但是我被警告不要这样做(同时运行2个UI线程),并且传递时遇到麻烦周围的价值观.更不用说是否使用线程方法无法在不使CPU完全过载的情况下准确地表示正在发生的进度(让另一个线程在while(true)中运行,并且在您从某个位置调用updateMethod时进行更新)处理)
我还有其他选择吗?因为最不利的方面是我随程序一起更新进度条的第一个方面.
解决方法:
使用后台工作程序时,您应该在后台工作程序中执行所有非UI处理.您不应在仍在UI线程中进行处理的同时使用它来更新UI.
通过将工作移至BGW的DoWork处理程序,您可以释放UI线程,使其可以处理UI事件,包括进度条的更新.