2012-03-16 76 views
2

我正在測試以下內容並試圖瞭解它如何將其應用於我的實時應用程序。該應用程序似乎有或沒有.SynchronizingObject = this;。我看了MSDN,但可以做一個替代的解釋,這條線做什麼,爲什麼我需要包括它?這是防守加成嗎? 「.SynchronizingObject = this;」

private void btRunProcessAndRefresh_Click_1(object sender, EventArgs e) { 
    //instantiate a new process and tell it where to find file 
    myProcess =new Process(); 
    myProcess.StartInfo.FileName [email protected]"notepad.exe"; 

    //creates an action to execute when the event exits 
    myProcess.Exited +=new EventHandler(MyProcessExited); 
    myProcess.EnableRaisingEvents =true; 

    //myProcess.SynchronizingObject =this; 
    elapsedTime = 0; 
    myProcess.Start(); 

    myTimer =new System.Windows.Forms.Timer(); 
    myTimer.Tick +=new EventHandler(TimerTickEvent); 
    myTimer.Interval = SLEEP_AMOUNT; 
    myTimer.Start(); 
} 

private void MyProcessExited(Object source,EventArgs e) { 
    myTimer.Stop(); 
} 

private void TimerTickEvent(Object myObject,EventArgs myEventArgs) { 
    myTimer.Stop(); 
    elapsedTime += SLEEP_AMOUNT; 
    if (elapsedTime > MAXIMUM_EXECUTION_TIME) 
     myProcess.Kill(); 
    else 
     myTimer.Start(); 
} 
+2

要正確響應,您應該顯示您的MyProcessExited方法。 SynchronizingObject需要確保您的_MyProcessExited_方法將在窗體的同一線程上調用。否則,如果您打算在該方法內的UI中更改某些內容,則需要採取額外的措施。 – Steve 2012-03-16 09:06:33

+0

本地MSDN的URL根本沒有意義。 – abatishchev 2012-03-16 09:12:37

+0

@steve - 我現在將提供完整的代碼 – whytheq 2012-03-16 11:46:00

回答

3

MSDN

您應該設置到SynchronizingObject的Windows窗體組件,以確保已退出事件處理程序中創建該組件的線程執行。

如果您在控制檯應用程序中執行代碼序列,則可能不需要設置SynchronizingObject;但如果您想從Exited事件處理程序訪問UI,則必須設置此成員。

+0

,所以在我的代碼中它會確保我返回到線程 – whytheq 2012-03-16 11:54:26

+0

@whytheq:是的,沒錯! – 2012-03-16 13:22:00