.NET线程与锁定和等待

Ash*_*Ash 4 .net c# multithreading locking

我试图让我的GUI线程在长时间运行操作期间保持响应.这些操作必须是同步的,因为它们通常是在请求的操作完成之前需要完成的操作.

我试图用后台工作人员,监视器和锁定对象来做这件事.本质上我想在长时间运行的进程启动之前启动一个计时器,在后台线程中启动长时间运行的进程,并等待后台工作线程表示它已经完成,然后再继续使用相关代码.如果长时间运行的过程花费的时间过长,则向用户显示"加载..."对话框,以便他们知道应用程序没有崩溃.

一个例子可能是图形包中的用户点击按钮,在我们可以绘制图像然后打印pi计算到顶部的一百万个小数位之前,必须从磁盘加载大图像.

我无法从磁盘异步加载图像,这将使UI保持响应,因为用户可以启动另一个操作,这会扰乱程序状态(即撤消操作).

可以简单地将光标更改为沙漏并完成它,但在许多情况下我希望用户也可以取消操作 - 带有取消按钮的"正在加载..."对话会照顾这很好.


我最初的目标是使用一个锁对象,System.Threading.Monitor.Enter()以便UI线程等待长时间运行的线程完成,然后继续执行.如果计时器在长时间运行的线程完成之前触发,则UI线程仍可用于处理事件并在屏幕上绘制对话框.

我遇到的问题是,在UI线程尝试获取锁定之前,我无法让后台工作程序锁定对象.

相反,我正在使用一些非常黑盒子的第三方代码进行处理.因此,我不能将代码定制为线程友好的并报告其进度或支持取消.


我的问题

是否有任何经过验证的方式包装第三方代码,以便UI线程保持响应,如果需要,我可以显示取消对话? - 将会有许多实例,其中长时间运行的操作几乎立即完成,并且不需要显示对话框.


更进一步的澄清

我为什么要这样做?异步操作是Windows应用程序的宠儿......

好吧,我不想在启动长时间运行异步操作时锁定用户界面的每个方面,然后在完成后解锁每个方面.我可以 - 通过设置光标或物理禁用所有的删除等等,但实际上我更愿意能够简单地将调用包装在'某些对象/方法等'中,这将允许弹出一个对话框(如果仅当)操作花费足够长的时间才能影响用户.我不必担心执行流程的变化,我仍然(总体上)能够在代码中维护原子操作(不会在回调中分开)并且仍然具有"响应"UI.

我可以理解为什么到目前为止我在将BackgroundWorker/Thread制作成同步阻塞线程方面没有成功,但我确实担心我不得不while(true){ sleep() }在GUI线程中沿着路线走,而不是使用锁.

Mik*_*all 6

在你进一步深入研究之前,我会认真考虑.NET中的BackgroundWorker类.你说你使用的是"背景工作者",所以我不确定这是不是你的意思.它具有从工作人员功能中回调您的UI并具有进度通知的功能.通过进度通知,它可以显着减少对同步对象的需求.