繁体   English   中英

如何在.net中除Main UI线程之外的其他线程上运行UI?

[英]How can I run UI on a thread other than the Main UI thread in .net?

我知道有关此还有其他问题,但是大多数最终答案都不是我要建议的。 因此,我知道您不应该这样做。 这个问题的原因是我仍然想这样做,我该怎么做...

这就是为什么我要违反规则...

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

现在让我们想象一下应用程序由于死锁而挂起了...

如果那小部分的UI和该按钮的处理程序可以驻留在主ui线程以外的线程上,以免陷入僵局,那将是很好的。 单击后,它将收集其他线程的所有调用堆栈,并将它们提交给我们的错误报告服务。

现在,知道了这种情况,可以在.net中完成吗?

是的,在“主线程”之外的其他线程上创建UI并没有什么魔术。 始终牢记的重要规则是在创建UI的线程上与该UI进行交互。

不过,我仍然认为您是从错误的角度进行攻击。 您可能应该改为将所有工作推离主线程。 这样,您可以最大程度地降低该线程冻结的风险,然后您就不必使用非传统的解决方案来报告错误了。

我在非主线程上创建表单的情况有很多种,每次都可以正常工作。

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

您将使用什么魔术来从崩溃的应用程序和锁定的主线程中收集数据,这取决于您:)

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

无论如何,如果要从其他线程调用UI,则应执行上下文切换 。对于winforms,请遵循以下答案

听起来您想保持UI处于活动状态,即使某些其他操作陷入了僵局。 如果是这样,也许将使用异步编程 使用异步管理潜在的挂断任务将使应用程序的其余部分保持响应。

我们希望客户在崩溃或挂起时向我们提交错误

如果进行检测/报告,您还可以考虑添加某种程度的数据,以便无需用户输入即可获得此数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM