2012-07-29 14 views
0

我在C#中的多線程應用程序的工作/。NET
我想每個線程創建其自己的形式,因此它可以訪問它並顯示其其表格中的信息沒有任何問題
有沒有辦法做到那?
我試過Application.Run(新的MyForm()),但問題是這個函數阻止執行,我的線程無法完成它的工作。多個GUI一個foreach線程在.net中?

+1

做form.Show()代替。他們不在單獨的線程中,但他們也不阻止。在不同的線程中產生太多的表單似乎並不是一個好主意。 – nawfal 2012-07-29 22:31:46

+0

爲什麼它不是一個好主意?我認爲這比從所有主題更新一個gui更好 – 2012-07-29 22:35:29

回答

1

您可以使用您的窗體的Show方法表現出來,即使你想顯示在Dialog形式你可以使用ShowDialog方法的形式,對話將在其他形式的頂部。

+1

大概每個線程都會有一些信息,它會在它自己的窗口中實時顯示。所以模態形式不會起作用;他們會阻止。 – 2012-07-29 22:39:43

+0

@RobertHarvey - 你確定嗎?攜帶發佈到其他表單的數據的消息會發生什麼情況?好的,他們沒有專注,但是他們應該仍然能夠處理不需要專注的張貼消息? – 2012-07-29 23:24:58

0

您需要使用Show方法從其線程中打開窗體,並且不能在不同線程的窗體之間鏈接,如來自不同線程的MDI父窗口和子窗體。 順便說一下,你可以在主要的GUI線程中打開所有的窗體,並且使用invoke從其他線程顯示數據而沒有任何問題,我認爲這種方法更好。看這裏:http://msdn.microsoft.com/en-us/library/ms951089.aspx

2

這是設計。線程一次只能做一件事,所以如果你的代碼運行在該線程上的UI將被阻塞,並且如果你想運行一個UI,你將不得不使用一些消息傳遞構造(例如計時器)來獲取你的工作完成了。

正確的方法確實是擁有一個UI線程,並讓其他線程異步發佈進度消息以便在UI上顯示(例如,在窗體上使用BeginInvoke,這可以安全地從其他線程調用)。

+0

您也可以使用一個'BackgroundWorker',它具有一種安全的方式將狀態信息封送回表單。 – 2012-07-29 22:42:03

+0

對。我在.NET 1.1中完成了這種工作,但當時沒有BackgroundWorker,我總是忘記它。在此期間,我主要進行服務器開發,這使我免於使用線程綁定的窗口消息。 – Lucero 2012-07-29 22:43:39