我有一個TCP服務器應用程序,並具有與TCP客戶端進行通信的線程。當我從客戶端收到數據時,我想通過使用此數據創建新表單,但我無法在一個線程中創建表單。我可以使用按鈕點擊事件輕鬆創建表單。C#新窗體在線程中創建
我在哪裏錯了?
謝謝。
我有一個TCP服務器應用程序,並具有與TCP客戶端進行通信的線程。當我從客戶端收到數據時,我想通過使用此數據創建新表單,但我無法在一個線程中創建表單。我可以使用按鈕點擊事件輕鬆創建表單。C#新窗體在線程中創建
我在哪裏錯了?
謝謝。
您必須將GUI上下文切換到某個地方以創建新表單 - 某處您需要BeginInvoke()。
這是什麼樣的服務器 - 是一個'經典'同步服務器,其中每個客戶端連接有一個監聽線程和一個服務器客戶端線程?
您不想在客戶端連接時創建表單,您只希望在連接的客戶端專門詢問時創建此表單,是的?
示例代碼來完成這項工作:
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();
}
嘗試將VB代碼轉換爲C#。 –
使用http://www.developerfusion.com/tools/convert/vb-to-csharp/將語言轉換 –
-1。實際上是錯誤的。我經常看到 - 抱歉 - 程序員不知道什麼,然後說話。任何線程都可以像運行調度程序一樣打開窗體,並且創建一個窗體也很簡單。我在這裏有一個應用程序,每個「主」窗口有一個線程(運行其中的8個有時進行繁重的數據處理)。 http://stackoverflow.com/questions/4698080/spawn-a-new-thread-to-open-a-new-window-and-close-it-from-a-different-thread有示例代碼。創建表單方法打開表單,然後運行調度程序。不重要的。 – TomTom
@TomTom - 是的,當然其他線程可以是UI線程,創建窗口和獲取/發送消息。如果他們不能,則只有一個進程:)在這種情況下,客戶端線程將不得不運行調度程序來處理消息 - 如果不需要進行阻塞調用,那麼很好。在OP案例中,我不確定是否爲每個客戶端運行GUI線程是個好主意。 –
我也沒有。但這不是重點 - 答案完全錯誤,表明只有「The」UI線程才能創建表單,這意味着它只有一個。 – TomTom