C# 这是防御性的补充吗&引用;。同步对象=此&引用;

C# 这是防御性的补充吗&引用;。同步对象=此&引用;,c#,.net,winforms,multithreading,C#,.net,Winforms,Multithreading,我正在测试以下内容,并试图了解它的作用,然后将其应用到我的live应用程序。应用程序似乎可以使用或不使用。SynchronizingObject=this。我已经看过了,但是可以用另一种解释来解释这一行的作用以及我为什么需要包含它 private void btRunProcessAndRefresh_Click_1(object sender, EventArgs e) { //instantiate a new process and tell it where to find fi

我正在测试以下内容,并试图了解它的作用,然后将其应用到我的live应用程序。应用程序似乎可以使用或不使用
。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 =@"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();
}

您应该将SynchronizingObject设置为Windows窗体组件,以确保退出的事件处理程序在创建该组件的线程中执行


如果在控制台应用程序中执行代码序列,则可能不需要设置SynchronizingObject;但是,如果要从退出的事件处理程序访问UI,则必须设置此成员。

要正确响应,应显示MyProcessExited方法。需要SynchronizingObject来确保在表单的同一线程上调用MyProcessExited方法。否则,如果您计划在该方法内更改UI中的某些内容,则需要采取额外的操作。本地MSDN的URL毫无意义。@steve-我将提供完整的代码now@abatishchev:好的,我会更正;哦,你已经编辑过了-谢谢我假设只有
myTimer.Stop()不会造成任何不良影响。但是,我将继续使用
myProcess.SynchronizingObject=this未注释,只是为了安全。因此,在我的代码中,它将确保我返回到带有表单的线程