2016-02-13 55 views
-2

我正在運行一個進程(exe文件),同時我想要一個'等待'窗口彈出。 使用BGW:backgroundWorker與進程和模態窗口

public void RunDesign() 
{ 
    BackgroundWorker m_oWorker = new BackgroundWorker(); 
    m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork); 
    m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted); 
    m_oWorker.RunWorkerAsync(); 

    // I want the following pop up window to be shown, while my exe file is running 
    wait_debug _wait_debug = new wait_debug(); 
    Process[] ExeName = Process.GetProcessesByName("AB"); //this is the exe file 
    if (ExeName.Length == 1) 
    { 
      _wait_debug.ShowDialog(); // Show() doesn't work either 
      _wait_debug.TopMost = true; 
    } 
} 

m_oWorker.DoWork方法我跑我的過程與p.StartInfo並運行良好。 我的問題是沒有顯示wait_debug窗口。 任何想法?

+0

在調試器中,它是否真的到達'_wait_debug.ShowDialog();'由於'if'後衛? – MickyD

+0

是的。我放了一個斷點,它顯示該進程沒有運行。只有在我繼續跑步之後,運動員才能運行。 –

回答

0

我懷疑主線程在您的線程有機會運行該進程之前執行檢查GetProcessesByName。要麼主線程等待像ManualResetEvent這樣的同步對象,要麼只是循環執行,直到GetProcessesByName實際返回某些內容。

這裏有一個簡單的解決辦法:

// NOTE: this loop will block your main GUI thread so it might be 
// a good idea not to wait too long by having a timeout mechanism 

Process process=null; 

do 
{ 
    Thread.Sleep(0); // be nice to CPU 

    Process[] items = Process.GetProcessesByName("AB"); //this is the exe file 
    if (items.Length == 1) 
    { 
     process = items[0]; 
    } 

    // break if taking too long 
} 
while (process == null); 

// if process is still null then we timed out. handle appropriately 

_wait_debug.ShowDialog(); // Show() doesn't work either 
_wait_debug.TopMost = true; 

您可以驗證您現有的條件在調試器 - 你會發現它實際上並沒有到達行_wait_debug.ShowDialog();由於if後衛。您的主線程通過查找尚未開始的進程來打敗工作線程。

+0

謝謝,但它仍然無法正常工作。首先ShowDialog行應該在do語句中,對嗎?因爲只要進程正在運行,我就想展示它們。無論如何,ShowDialog確實有效,但它是Modal,即使進程完成(因爲進程在完成後它爲空),它仍會一遍又一遍地重複。其次,如果我使用Show()(這是Modaless),它會陷入困境,而我完全不理解。 –

+0

_「應該在做聲明裏面吧?」 - - 錯了。在這種情況下,你可以使用'Show'。您可以關閉後臺工作人員完成的事件處理程序中的窗口。至於你的評論的其餘部分,我不知道你在說什麼 – MickyD