如何在.net中的主UI线程之外的线程上运行UI
本文关键字:UI 线程 运行 net | 更新日期: 2023-09-27 18:21:20
我知道还有其他问题,但大多数问题最终都得到了答案——不要按照我的建议去做。所以我知道你不应该。这个问题的原因是我无论如何都想做,我该怎么做…
这就是为什么我想打破规则。。。
假设我有一个复杂的应用程序,它是版本1,我们希望我们的客户在发生崩溃或挂起时向我们提交错误。现在假设我在主表单的顶部有一个按钮,他们点击它来提交报告。
现在让我们假设应用程序由于死锁而挂起。。。
如果UI的一小部分和该按钮的处理程序可以驻留在主UI线程之外的线程上,这样它就不会陷入死锁,那就太好了。点击后,它会收集其他线程的所有调用堆栈,并将它们提交给我们的错误报告服务。
现在,知道了这个场景,这可以在.net中完成吗?
是的,在"主线程"之外的另一个线程上创建UI没有什么魔力。需要始终记住的重要规则是在创建UI的线程上与该UI进行交互
尽管如此,我觉得你是从错误的角度来攻击这件事的。相反,您可能应该努力将所有工作从主线程中推掉。这样就可以最大限度地降低线程冻结的风险,然后就不需要使用非正统的错误报告解决方案。
我有各种在非主线程上创建表单的情况,每次都很好。
创建一个新的Thread
,并从中显示一个Form
。将为该线程创建新的消息循环,一切都会正常运行。
你会用什么魔法从崩溃的应用程序和锁定的主线程中收集数据,这取决于你:)
如果应用程序挂起,则主消息循环将失效,因此ui将无法工作。作为解决您问题的方法,我会考虑使用外部应用程序(另一个exe),该应用程序将在报告的情况下调用
在任何情况下,如果你想从其他线程调用UI,你应该执行上下文切换。在winforms的情况下,按照这个答案
听起来您希望保持UI的活力,即使其他操作陷入死锁。如果是这样的话,也许异步编程会有用。使用Async来管理可能挂起的任务将允许应用程序的其余部分保持响应。
我们希望我们的客户在崩溃或挂起的情况下向我们提交错误
您还可以考虑添加某种程度的if指令插入/报告,这样您就可以在不需要用户输入的情况下获得这些数据。