2011-05-11 45 views
0

當打開第二個表格 的方法/函數在另一個線程上時,是否可以打開我的第二個表單?用另一個線程上的方法/函數打開另一個表單?

我已閱讀有關這個​​.. 其他線程,但它似乎我無法弄清楚如何使用調用

這裏就是我打開第二個形式 當IM調用這個..沒有正好..(因爲它的第二個線程)

TimerMode f2 = new TimerMode(); 
f2.ShowDialog(); 

請幫助我。我新手多-threading ..

回答

0

它應該做點什麼。這是因爲ShowDialog將運行自己的消息循環。 TimerMode窗體至少應該可見並且正常工作。但是,你是對的,這真的不是最好的做法,尤其是如果這個表單將與已經在主UI線程上運行的其他表單交互。

這裏是你如何做到這一點。

anotherForm.Invoke(
    (MethodInvoker)(() => 
    { 
    new TimerMode().ShowDialog(); 
    })); 

注意anotherForm是這已經是託管在主UI線程上的其他形式的一個參考。

+0

嗨,Brian,感謝您給出的示例代碼。它的作品像一個魅力,但我仍然有一個問題,我認爲這仍然與此線程相關..如果我使用.ShowDialog()它以某種方式停留在那裏..下面的代碼不執行..如果我使用.Show()現在讀取以下代碼集合,但TimerMode For看起來像是處於Not-Responding狀態(如在應用程序掛起時在Windows XP中)。這是我發現的。再次感謝您的回答。 – Katherina 2011-05-11 17:06:07

+0

也只是爲了添加,如果TimerMode現在顯示..我無法可見= false的第一種形式。它沒有任何反應。 =( – Katherina 2011-05-11 17:11:02

+0

)你將不得不發佈更多的代碼,沒有看到更大的圖片,我只能推測 – 2011-05-11 18:07:04

2

你需要在主窗口線程 上執行嘗試以下操作:

this.Invoke((MethodInvoker)delegate{ 
    TimerMode f2 = new TimerMode(); 
    f2.ShowDialog(); 
} 

這將正確的線程上創建它。

+0

嗨謝謝你的答案。生病嘗試你的提示,並給你一個反饋。再次感謝 – Katherina 2011-05-11 04:57:39

+0

你好。我試圖使用你給我的示例代碼。但沒有運氣,(關鍵字'這'是無效的靜態屬性,靜態方法,或靜態字段初始值設定項(CS0026))被突出顯示爲錯誤..也將這幫助我如何做像vb6(form2 .show?)再次感謝 – Katherina 2011-05-11 05:23:52