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