过程完成后如何更新UI表单



因此,我的主表单具有一个按钮,我可以在完成这个非常长的复制过程完成时启用。此复制过程每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?
   }
}

您可以致电Invoke

private void myProcess_Exited(object sender, System.EventArgs e)
{
    IsCopyComplete = true;
    button1.Invoke(new Action(() => button1.Enabled = true));
}

这是一篇有关对UI进行线程安全电话的文章。

有几种创建线程的方法。由于其内置功能用于更新UI,我最喜欢的是背景工作人员线程。(尽管这不是每种情况的正确工具)。


您可以将表格的引用传递给班级,尽管通常似乎以某种方式是错误的。该类不应该知道您的表格的UI组件。

我要做的是创建一个Exited事件可以发布的EventHandler。(您可以连接到多个事件,因此,如果您仍然需要设置IsCopyComplete = true,也只需离开该事件即可。)当Exited事件启动时,它将调用" ProcessExited" EventHandler而不知道是否其他任何订阅它。<<<<<<<<<<<<<<<<<<<<<<<</p>

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;
    }
}

然后以您的主要形式,您可以订阅活动。

public partial class mainForm : Form
{
    ....//initialize some stuff
    public class mainForm()
    {
        ...
        // not sure where you're instantiating `copy` - you may have to move this
        copy.ProcessExited += (s, a) =>
            button1.Invoke(new Action(() => button1.Enabled = true));
        ...
    }
    private void TimerEventProcessor(object sender, EventArgs e)
    {
        copy.GetNewCopy();
    }
}

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

在主题中声明处理程序方法,然后在下面的sunscribe

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

相关内容

  • 没有找到相关文章

最新更新