如何在.net中的主UI线程之外的线程上运行UI

本文关键字:UI 线程 运行 net | 更新日期: 2023-09-27 18:21:20

我知道还有其他问题,但大多数问题最终都得到了答案——不要按照我的建议去做。所以我知道你不应该。这个问题的原因是我无论如何都想做,我该怎么做…

这就是为什么我想打破规则。。。

假设我有一个复杂的应用程序,它是版本1,我们希望我们的客户在发生崩溃或挂起时向我们提交错误。现在假设我在主表单的顶部有一个按钮,他们点击它来提交报告。

现在让我们假设应用程序由于死锁而挂起。。。

如果UI的一小部分和该按钮的处理程序可以驻留在主UI线程之外的线程上,这样它就不会陷入死锁,那就太好了。点击后,它会收集其他线程的所有调用堆栈,并将它们提交给我们的错误报告服务。

现在,知道了这个场景,这可以在.net中完成吗?

如何在.net中的主UI线程之外的线程上运行UI

是的,在"主线程"之外的另一个线程上创建UI没有什么魔力。需要始终记住的重要规则是在创建UI的线程上与该UI进行交互

尽管如此,我觉得你是从错误的角度来攻击这件事的。相反,您可能应该努力将所有工作从主线程中推掉。这样就可以最大限度地降低线程冻结的风险,然后就不需要使用非正统的错误报告解决方案。

我有各种在非主线程上创建表单的情况,每次都很好。

创建一个新的Thread,并从中显示一个Form。将为该线程创建新的消息循环,一切都会正常运行。

你会用什么魔法从崩溃的应用程序和锁定的主线程中收集数据,这取决于你:)

如果应用程序挂起,则主消息循环将失效,因此ui将无法工作。作为解决您问题的方法,我会考虑使用外部应用程序(另一个exe),该应用程序将在报告的情况下调用

在任何情况下,如果你想从其他线程调用UI,你应该执行上下文切换。在winforms的情况下,按照这个答案

听起来您希望保持UI的活力,即使其他操作陷入死锁。如果是这样的话,也许异步编程会有用。使用Async来管理可能挂起的任务将允许应用程序的其余部分保持响应。

我们希望我们的客户在崩溃或挂起的情况下向我们提交错误

您还可以考虑添加某种程度的if指令插入/报告,这样您就可以在不需要用户输入的情况下获得这些数据。