gpt4 book ai didi

c# - .NET 线程与锁与等待

转载 作者:太空狗 更新时间:2023-10-30 00:28:40 25 4
gpt4 key购买 nike

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

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

这方面的一个例子可能是用户点击图形包中的按钮,必须先从磁盘加载大图像,然后我们才能绘制图像,然后在顶部打印计算到一百万位小数的圆周率。

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

可以简单地将光标更改为沙漏并完成它,但在许多情况下,我希望用户也能够取消操作 - “正在加载.. 。”带有取消按钮的对话可以很好地解决这个问题。


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

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

相当恼人的是,我正在使用一些非常黑盒的第 3 方代码来进行处理。因此,我无法将代码调整为线程友好型并报告其进度或支持取消。


我的问题

是否有任何行之有效的方法来包装第 3 方代码,以便 UI 线程保持响应,并且我可以在需要时显示取消对话? - 在许多情况下,长时间运行的操作几乎立即完成并且不需要显示对话框。


进一步说明

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

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

我能理解为什么到目前为止我一直未能成功将 BackgroundWorker/Thread 制作成同步阻塞线程,但我确实担心我将不得不进入 while(true){ sleep () } 在 GUI 线程中路由而不是使用锁。

最佳答案

在您进一步了解之前,我会认真考虑 BackgroundWorker .NET 中的类。您说您使用了“后台 worker ”,所以我不确定这是否是您的意思。它具有从您的工作函数中使用进度通知回调到您的 UI 的功能。有了进度通知,它应该会显着减少您对同步对象的需求。

关于c# - .NET 线程与锁与等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2282206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com