2011-01-12 46 views
6

所以我在我的應用程序中有一個線程,目的是偵聽來自服務器的消息並根據接收到的消息行事。在另一個線程上的新表單

當我想從服務器發出消息時遇到問題,當客戶端應用程序收到它時,客戶端應用程序會打開一個新窗體。然而,這種新形式只是立即凍結。

我認爲發生的事情是,新的表單被加載到與監聽服務器的線程相同的線程上,這當然是忙於監聽流,反過來阻塞線程。

通常,對於我在客戶端偵聽線程中的其他函數,我會使用調用來更新主窗體的UI,所以我想我要求的是如果這是一種調用新窗體的方法主要形式。

回答

15

我認爲這是Windows窗體,而不是WPF?從你的後臺線程,你不應該試圖創建任何形式,控制等或操縱它們。這隻能從主線程運行,並且可以處理Windows消息。

所以讓你的代碼到主線程,而不是後臺線程上執行,你可以使用Control.BeginInvoke方法,像這樣:

private static Form MainForm; // set this to your main form 

private void SomethingOnBackgroundThread() { 

    string someData = "some data"; 

    MainForm.BeginInvoke((Action)delegate { 

     var form = new MyForm(); 
     form.Text = someData; 
     form.Show(); 

    }); 
} 

主要的事情要記住的是,如果後臺線程不需要主線程的任何響應,你應該使用BeginInvoke,而不是Invoke。否則,如果主線程正忙於在後臺線程中等待,您可能會陷入死鎖。

0

你基本上自己給出了答案 - 只需執行代碼在GUI線程上使用Invoke創建表單。

相關問題