2

意図した順序で動作していないように見える関数があります。ちなみに、これはすべて Visual Studio の C# です。

ここでは、クリックされているボタンがあります (Step4)。プロセスが読み込まれるまで、ボタンは「Please Wait...」というテキストで赤くなり、その後、プログラムの名前で緑に変わります。ただし、プログラムをロードしているだけで、プロセスがロードされるまでデフォルトのテキストでデフォルトの灰色のままになり、その後プログラム名で緑色に変わります。なんらかの理由で、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";
    }
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

async比較のために、 .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 に答える