Visual Studio函数没有按顺序完成操作
本文关键字:顺序 操作 Studio 函数 Visual | 更新日期: 2023-09-27 18:18:30
我有一个函数似乎没有按预期顺序工作。顺便说一下,这些都是用Visual Studio中的c#编写的。
这里我们有一个按钮被点击(Step4),应该发生的是按钮应该变成红色,并写着"Please Wait…"直到进程加载,然后它会变成绿色,上面写着程序的名字。然而,它只是加载程序,并保持默认的灰色默认文本,直到进程加载,然后直接改变为绿色的程序名称。出于某种原因,它跳过了红色的"请等待"文本部分。下面是代码:
private void Step4_Click(object sender, EventArgs e)
{
Step4.BackColor = Color.DarkRed;
Step4.Text = "Please Wait...";
string strMobileStation = "C:''MWM''MobileStation''Station.exe";
Process MobileStation = Process.Start(strMobileStation);
MobileStation.WaitForInputIdle();
Step4.BackColor = Color.Lime;
Step4.Text = "Mobile Station";
}
问题是你在用户界面线程上做这个。
当你在UI线程上这样做时,你阻塞了UI线程,这反过来意味着用户界面不能处理消息。当该方法完成时,将处理消息,并显示最终结果。
正确的处理方法是将"work"(等待进程)移到后台线程中。
你可以通过Task
类做到这一点,即:
private void Step4_Click(object sender, EventArgs e)
{
Step4.BackColor = Color.DarkRed;
Step4.Text = "Please Wait...";
Task.Factory.StartNew( () =>
{
string strMobileStation = "C:''MWM''MobileStation''Station.exe";
Process MobileStation = Process.Start(strMobileStation);
MobileStation.WaitForInputIdle();
})
.ContinueWith(t =>
{
Step4.BackColor = Color.Lime;
Step4.Text = "Mobile Station";
}, TaskScheduler.FromCurrentSynchronizationContext());
}
出于比较的目的,下面是如何在。net 4.5中使用async
做同样的事情:
private async void Step4_Click(object sender, EventArgs e)
{
Step4.BackColor = Color.DarkRed;
Step4.Text = "Please Wait...";
await Task.Run(() =>
{
string strMobileStation = "C:''MWM''MobileStation''Station.exe";
Process MobileStation = Process.Start(strMobileStation);
MobileStation.WaitForInputIdle();
});
Step4.BackColor = Color.Lime;
Step4.Text = "Mobile Station";
}
尝试在另一个线程中启动并等待进程启动。MobileStation.WaitForInputIdle()
可能阻塞UI线程
你可以使用BackgroundWorker,它非常容易使用。