2

我有一个似乎没有按预期顺序工作的功能。顺便说一句,这一切都在 Visual Studio 中的 C# 中。

在这里,我们有一个正在被单击的按钮(步骤 4),应该发生的情况是该按钮应变为红色并显示文本“请稍候...”,直到进程加载,然后它将变为绿色并显示程序名称。但是,它只是加载程序,并在加载过程之前保持默认灰色和默认文本,然后直接变为绿色并显示程序名称。由于某种原因,它跳过了红色,请等待文本部分。这是代码:

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

3 回答 3

6

问题是您在用户界面线程上执行此操作。

当您在 UI 线程上执行此操作时,您会阻塞 UI 线程,这反过来意味着用户界面无法处理消息。当方法完成时,消息被处理,并显示最终结果。

处理这个问题的正确方法是将“工作”(等待进程)移动到后台线程中。

您可以通过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());
}
于 2013-06-13T18:55:20.357 回答
1

For comparison purposes, here's how you would do the same thing using async in .Net 4.5:

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";
}
于 2013-06-13T19:49:51.170 回答
0

尝试启动并等待进程在另一个线程中启动。MobileStation.WaitForInputIdle()可能阻塞了 UI 线程。

您可以使用BackgroundWorker,它很容易使用。

于 2013-06-13T19:01:37.577 回答