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

时间:2012-01-25 20:24:04

标签: c# .net winforms multithreading

我知道还有其他问题,但大多数答案都没有做我要提出的建议。所以我知道你不应该这样做。这个问题的原因是无论如何我想要这样做,我该怎么做......

这就是我想破坏规则的原因......

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

现在让我们想象应用程序因死锁而挂起......

如果那个小按钮和该按钮的处理程序可以存在于主ui线程以外的线程中,那么它就不会陷入死锁状态。单击时,它将收集其他线程的所有调用堆栈,并将它们提交给我们的错误报告服务。

现在,了解情景,可以在.net吗?

中完成

4 个答案:

答案 0 :(得分:5)

是的,在“主线程”之外的另一个线程上创建UI没有任何魔力。始终牢记的重要规则是在创建它的线程上与该UI进行交互。

不过,我觉得你是从错误的角度攻击这个。您可能应该努力将所有工作从主线程推出。这样,您可以最大限度地降低该线程冻结的风险,然后您无需使用非正统的解决方案来报告错误。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

在任何情况下,如果你想从其他线程调用UI,你应该执行context switch如果是winforms,请关注this answer

答案 3 :(得分:0)

听起来你想保持UI活着,即使其他一些操作陷入僵局。如果是这样,也许Asynchronous Programming会有用。使用Async管理可能挂起的任务将允许应用程序的其余部分保持响应。

  

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

如果检测/报告,您可能还会考虑添加一些学位,这样您就可以在不需要用户输入的情况下获得此数据。