2012-04-30 127 views
0

我有一個TCP服務器應用程序,並具有與TCP客戶端進行通信的線程。當我從客戶端收到數據時,我想通過使用此數據創建新表單,但我無法在一個線程中創建表單。我可以使用按鈕點擊事件輕鬆創建表單。C#新窗體在線程中創建

我在哪裏錯了?

謝謝。

回答

4

爲了避免出現這種情況,最好讓應用程序的原始UI線程處理新表單的創建並且不要有多個UI線程。幸運的是,您可以在該線程上調用操作。

請參閱here關於如何在WinForms或here上執行WPF/Silverlight中的操作。

+1

-1。實際上是錯誤的。我經常看到 - 抱歉 - 程序員不知道什麼,然後說話。任何線程都可以像運行調度程序一樣打開窗體,並且創建一個窗體也很簡單。我在這裏有一個應用程序,每個「主」窗口有一個線程(運行其中的8個有時進行繁重的數據處理)。 http://stackoverflow.com/questions/4698080/spawn-a-new-thread-to-open-a-new-window-and-close-it-from-a-different-thread有示例代碼。創建表單方法打開表單,然後運行調度程序。不重要的。 – TomTom

+0

@TomTom - 是的,當然其他線程可以是UI線程,創建窗口和獲取/發送消息。如果他們不能,則只有一個進程:)在這種情況下,客戶端線程將不得不運行調度程序來處理消息 - 如果不需要進行阻塞調用,那麼很好。在OP案例中,我不確定是否爲每個客戶端運行GUI線程是個好主意。 –

+0

我也沒有。但這不是重點 - 答案完全錯誤,表明只有「The」UI線程才能創建表單,這意味着它只有一個。 – TomTom

0

您必須將GUI上下文切換到某個地方以創建新表單 - 某處您需要BeginInvoke()。

這是什麼樣的服務器 - 是一個'經典'同步服務器,其中每個客戶端連接有一個監聽線程和一個服務器客戶端線程?

您不想在客戶端連接時創建表單,您只希望在連接的客戶端專門詢問時創建此表單,是的?

1

示例代碼來完成這項工作:

private void Button1_Click(object sender, EventArgs e) 
{ 
    Thread t1 = new Thread(StartMe); 
    t1.Name = "Custom Thread"; 
    t1.IsBackground = true; 
    t1.Start(); 
} 

private void StartMe() 
{ 
    //We are switching to main UI thread. 
    TextBox1.Invoke(new InvokeDelegate(InvokeMethod), null); 
} 

public void InvokeMethod() 
{ 
    //This function will be on main thread if called by Control.Invoke/Control.BeginInvoke 
    MyForm frm = new MyForm(); 
    frm.Show(); 
} 
+0

嘗試將VB代碼轉換爲C#。 –

+0

使用http://www.developerfusion.com/tools/convert/vb-to-csharp/將語言轉換 –

相關問題