2012-01-25 116 views
1

我知道還有其他一些問題,但最終的答案是不要做我將要提出的建議。所以我知道你不應該這樣做。這樣做的原因問題是,我想這樣做也無妨,我該怎麼辦呢?如何在.net中的主UI線程以外的線程上運行UI?

這是爲什麼我要打破規則...

比方說,我有一個複雜的應用程序,它是版本1,我們希望我們的客戶在發生崩潰或掛起時向我們提交錯誤。現在讓我們說我在他們點擊提交報告的主窗體頂部有一個按鈕。

現在讓我們來想象一下該應用程序掛起,因爲死鎖的...

這將是很好,如果那一小塊用戶界面和處理該按鈕可以住上比主UI線程以外的線程,這樣它沒有陷入僵局。點擊後,它將收集其他線程的所有調用堆棧並將它們提交給我們的錯誤報告服務。

現在,瞭解情況,可以在.net中完成嗎?

+0

那麼你的問題如何防止跨線程異常,但仍然運行在不同的線程? –

+0

我很想知道你打算如何收集託管線程堆棧。到目前爲止,我所知道的唯一解決方案就是實現自己定製的小型調試器,將其啓動,附加到您的應用並將其轉儲堆棧,然後分離,報告和死亡。 – antiduh

回答

5

是的,在除「主線程」之外的另一線程上創建UI方面沒有任何魔力。始終牢記的重要規則是在創建它的線程上與該UI進行交互。

不過,我覺得你是從錯誤的角度來攻擊這件事的。您可能應該努力將所有工作從主線程中解放出來。這樣可以最大限度地降低該線程凍結的風險,然後您就無需訴諸非正統的解決方案來進行錯誤報告。

+0

感謝您的建議,我們確實已經在其他線程上做了大量工作,但是在處理像圖像這樣的資源時,您必須監視它們,以免兩個線程一次嘗試使用它們。那麼你有死鎖的風險,這就是我如何到達這裏。 –

+0

我還應該在這裏提及超過一百萬行代碼:-) –

+0

'在處理像圖像這樣的資源時,您必須監視它們,因此沒有兩個線程一次嘗試使用它們,這是否特別困難?圖像有什麼特別之處?一個圖像是一個對象實例,像大多數其他的東西? –

0

如果應用程序掛起,您的主要消息循環已死亡,因此ui將不起作用。至於解決方法您的問題我會考慮將在報告

的情況下,在任何情況下調用外部應用程序(EXE另一個)的使用,如果你想調用其他線程UI您應該執行context switch在的WinForms的情況下, ,請按照this answer

+0

在我的方案中,如果主UI線程死鎖,從單獨的線程調用調用也會掛起該線程。 –

2

我有在非主線程上創建窗體的各種情況,並且它每次都正常工作。

創建一個新的Thread,並從中顯示一個Form。新的消息循環將爲該線程創建,一切都將正常運行。

,你會用什麼魔法從崩潰的應用程序收集數據,並鎖定主線程,這取決於你:)

0

這聽起來像你想保持UI活着,甚至當一些其他操作陷入僵局。如果是這樣,也許Asynchronous Programming會有用。使用異步來管理可能掛起的任務將允許應用程序的其餘部分保持響應。

我們希望我們的客戶提交錯誤,我們在崩潰的事件或掛起

您也可以考慮,如果儀表/報告將一定程度上,這樣你也會有這樣的數據,而無需用戶輸入。

+0

感謝馬克,異步編程只是我自己會做的奇特語法(因爲我有一個.net 2.0依賴)。你所建議的是我正在寫的內容和問題的原因。 –

+0

謝謝史蒂夫;沒有知道你是2.0依賴的。雖然Async的一些好處是,它簡化了代碼開發並使代碼的意圖更加明顯。 –

相關問題