2013-07-09 38 views
2

我嘗試在線程退出時打開新的子窗體(BuyNow窗體),並確定許可證類型已過期。在一個線程中,我打開一個新的進程,執行許可證計算並將信息發送回主進程。問題是,在收到所有信息之前退出線程,因此我無法打開BuyNow表單,因爲它不知道許可證已過期。在線程中打開新的子窗體

這是代碼:

 BackgroundWorker BW = new BackgroundWorker(); 
     BW.DoWork += (sender, e) => 
      { 
       Process.Start("LicenseManager.exe", "-Check"); 
       // PSI Info, DataRecieved Event Args and etc.. included in Process. 
       // Opens the process which takes about 5 second to calculate and post 
       // license information. Then LicenseMode changes to TrialExpired 
       // if not activated and trial expired. 
      }; 
     BW.RunWorkerCompleted += (sender, e) => 
      { 
       // This never gets executed because License is not changed to TrialExpired by the time BW is completed. 
       if (LicenseMode == License.TrialExpired) 
       { 
        new BuyNowForm().Show(); 
       } 
      }; 
     BW.RunWorkerAsync(); 

我試圖打開BuyNowForm而在一個線程但凍結新創建的窗體。我不想嘗試Thread.Sleep,並等待進程發送信息的額外時間。 Thread.Join()似乎凍結了幾秒主界面。 Process.Exited + =也不起作用,因爲進程是在線程中創建的,所以當它退出時,BuyNowForm仍然在線程中創建。

你們能想到什麼?

回答

3

Process類有一個WaitForExit方法。這會令人驚訝,直到流程退出。你必須這樣做(顯然)在DoWork

您不應該從另一個線程打開表單(這對於DoWork是正確的)。 RunWorkerCompleted將是正確的方式,因爲它在主GUI線程中執行。

+0

天啊!我一直在想這麼多,我忽略了最簡單的解決方案大聲笑。非常感謝你的幫助(: - 解決了問題,將在10分鐘內「接受」(要求) – JonJon2244

+0

只需更新,我也可以通過調用它來打開它,這將修復凍結錯誤。 – JonJon2244