pro.WaitForExit();
使得UI線程凍結,因此無法更新。
要停止用戶執行操作,可以在進程運行時禁用某些控件。當用戶關閉進程時,您可以訂閱process.Exited
事件並啓用您的控件。
private void button1_Click(object sender, EventArgs e)
{
Process pro = new Process();
pro.StartInfo.FileName = "notepad";
pro.StartInfo.Arguments = "";
pro.Start();
button1.Enabled = false;
pro.EnableRaisingEvents = true;
pro.Exited += pro_Exited;
}
void pro_Exited(object sender, EventArgs e)
{
button1.Invoke((MethodInvoker) delegate { button1.Enabled = true; });
}
更新
作爲另一個答案建議你應該EnableRaisingEvents
屬性設置爲true
。 另外pro_Exited
方法會運行在不同的線程中,所以您需要使用Control.Invoke
方法來更改UI。
更新2 如果不能刪除pro.WaitForExit();
可以使用其他定時器,因爲System.Windows.Forms.Timer
在UI線程中運行,並阻斷它。
private System.Threading.Timer timer = new System.Threading.Timer(Callback);
public Form()
{
InitializeComponent();
timer.Change(0, 1000);
}
private void Callback(object state)
{
DateTime dtime = DateTime.Now;
string date_time = dtime.ToString("dd/MM/yyyy HH:mm:ss");
button1.Invoke((MethodInvoker)delegate { textBox1.Text = date_time; });
}
它不會更新textBox
,當process
被打開,但計時器將運行,並可以做一些工作。
更新3 在多個進程的情況下,你可以指望他們,併爲您在pro_Exited
法活動進程的數量。
private volatile int activeProcessCount = 0;
private void pro_Exited(object sender, EventArgs e)
{
activeProcessCount--;
if (activeProcessCount == 0)
{
button1.Invoke((MethodInvoker) delegate { button1.Enabled = true; });
}
}
private void button1_Click(object sender, EventArgs e)
{
//code
activeProcessCount = 2;
pro1.Start();
pro2.Start();
}
什麼使你相信計時器沒有運行?是否因爲文本框沒有更新?這並不意味着計時器沒有運行。 –
刪除pro.WaitForExit(),它會繼續更新文本框 – terrybozzio
@John Saunders,我試過不使用文本框,並替換像log.txt這樣的文本文件,每隔1秒我會將date_time寫入文件。但沒有看到結果。 –