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

Visual Studio函数没有按顺序完成操作

问题是你在用户界面线程上做这个。

当你在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,它非常容易使用。