簡體   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