所以我的主窗体有一个按钮,当这个很长的复制过程完成时我会启用它。这个复制过程每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?
}
}
答案 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);