如何在流程完成时更新UI表单?

时间:2014-01-23 23:42:38

标签: c# multithreading event-handling

所以我的主窗体有一个按钮,当这个很长的复制过程完成时我会启用它。这个复制过程每10分钟发生一次并检查更新等。我坚持如何让进程通知mainform它已完成复制。这是我到目前为止所做的:

public partial class mainForm : Form
{
 ....//initialize some stuff

    private void TimerEventProcessor(object sender, EventArgs e)
    {
     ....
     copy.GetNewCopy();
    }
}

class Copy
{
   private bool IsCopyComplete;
   ....
   public void GetNewCopy()
   {
       Process proc = new Process();
       IsCopyComplete = false;
       proc.EnableRaisingEvents = true;
       proc.Exited += new EventHandler(myProcess_Exited);
       proc.Start();
   }

   private void myProcess_Exited(object sender, System.EventArgs e)
   {
       IsCopyComplete = true;

       // how to trigger mainform that process is complete?
   }

}

2 个答案:

答案 0 :(得分:1)

您可以致电Invoke

private void myProcess_Exited(object sender, System.EventArgs e)
{
    IsCopyComplete = true;

    button1.Invoke(new Action(() => button1.Enabled = true));
}

以下是关于制作thread-safe calls to the UI的文章。

有几种方法可以创建一个线程。由于其内置的更新UI功能,我最喜欢的是BackgroundWorker Thread(虽然它不适合所有情况)。


您可以将表单的引用传递给类,尽管这通常在某种程度上看起来是错误的。该类不应该知道您的表单的UI组件。

我要做的是创建EventHandler事件可以发布到的Exited。 (您可以附加到多个事件,因此如果您仍然需要设置IsCopyComplete = true,那么也要离开该事件。)当Exited事件触发时,它将调用“ProcessExited”{{1不知道是否有任何其他订阅它。

EventHandler

然后在您的主表单中,您可以订阅该活动。

class Copy
{
    public event EventHandler ProcessExited;

    private bool IsCopyComplete;
    ....
    public void GetNewCopy()
    {
        Process proc = new Process();
        IsCopyComplete = false;
        proc.EnableRaisingEvents = true;
        proc.Exited += ProcessExited;
        proc.Exited += new EventHandler(myProcess_Exited);
        proc.StartInfo = new ProcessStartInfo("cmd.exe"); // specify your process - replace cmd.exe with whatever's appropriate
        proc.Start();
    }

    private void myProcess_Exited(object sender, System.EventArgs e)
    {
        IsCopyComplete = true;
    }
}

答案 1 :(得分:1)

有很多方法可以做到这一点。这是一个

在Mainform中声明Handler方法,然后按照以下方式进行sunscribe

proc.Exited += new EventHandler(MainForm1.myProcess_Exited);