2010-07-26 71 views
1

我有一個Windows窗體應用程序,同時運行兩個線程,在任務欄中運行UI線程。 UI線程實際上執行與其他進程完全分離的功能,但在新用戶登錄到應用程序的情況下,我需要從非UI線程彈出一個設置窗口。保持線程等待窗體響應?

這裏是我的Program.cs代碼:

static void Main() 
    { 
     ThreadStart start = new ThreadStart(Waiting.wait); 
     Thread waiting = new Thread(start); 
     waiting.Start(); 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(true); 
     Application.Run(TaskBarIcon.getInstance()); 
    } 

目前,前TaskBarIcon可以完全實例,一種配置方法必須等待線程運行完成。這是通過來回傳遞鎖來實現的。 我希望在配置方法正在處理時彈出此設置菜單,並讓方法等待直到設置菜單運行完成。但是,除非直接從Application.Run()方法運行設置菜單,否則我甚至無法正確顯示菜單。

我對C#非常陌生....能夠在Java中快速完成這項工作,但C#似乎以不同的方式做事。

任何建議或解決方案將不勝感激!

badPanda

+0

*但是C#似乎以不同的方式做事情* >>真的,雖然方式相似,但如果您駕駛其他路線,很容易在路上迷路。 – Abel 2010-07-26 19:11:17

回答

1

我懷疑它是什麼情況是,設置菜單的形式是不工作線程接收窗口的消息,這就是爲什麼它沒有顯示出來。所有表格和控件都需要消息泵才能正常工作。有得到一個消息泵啓動的各種不同的方式,但兩個最適用於你:

  • Application.Run
  • Form.ShowDialog

如果您在設置菜單中調用ShowDialog形式,那麼它應該顯示在工作線程上。當然,這個調用會阻塞,直到表單被關閉,這樣會阻止配置方法的其餘部分執行,但是這又可能正是你想要的。

如果您希望主UI線程(稱爲Application.Run的主線程)等待此配置方法完成,請使用WaitHandle指示配置任務何時完成。它可能如下所示。

static void Main() 
{ 
    var configured = new ManualResetEvent(false); 
    var worker = new Thread(
    () => 
    { 
     // Do some stuff here. 

     CallYourConfigurationMethod(); 
     configured.Set() // Signal that configuration is complete. 

     // Do some more stuff here. 
    }); 
    worker.Start(); 
    configured.WaitOne(); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(true); 
    Application.Run(TaskBarIcon.getInstance()); 
} 
+0

謝謝!這正是我所需要的。 – badpanda 2010-07-26 20:06:29