4

私はこのコードを持っています:

void wait(int ms)
{
    System.Threading.Thread.Sleep(ms);
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    info.Text = "step 1";
    wait(1000);
    info.Text = "step 2";
    wait(1000);
    info.Text = "step 3";
    wait(1000);
    info.Text = "step 4";
    wait(1000);
}

そして問題は、voidbutton1_Click全体が終了した後にtextbox.textが更新されることです。オンエアでは更新されません:(

お願い、どうやって?

4

4 に答える 4

9

これを行うだけです。

private void button1_Click(object sender, RoutedEventArgs e)
    {
        ThreadPool.QueueUserWorkItem((o) =>
             {
                 Dispatcher.Invoke((Action) (() => info.Text = "step 1"));
                 wait(1000);
                 Dispatcher.Invoke((Action) (() => info.Text = "step 2"));
                 wait(1000);
                 Dispatcher.Invoke((Action) (() => info.Text = "step 3"));
                 wait(1000);
                 Dispatcher.Invoke((Action) (() => info.Text = "step 4"));
                 wait(1000);
             });
    }
于 2010-11-18T14:46:07.377 に答える
3

GuIスレッドは、button1_Clickメソッドが戻るまで更新されません。そのため、最後の値しか表示されません。長いメソッドを非同期呼び出しに入れるか、スレッドを使用する必要があります。

于 2010-11-17T14:45:01.000 に答える
0

測定/配置(したがってレンダリング)は非同期で行われるため、画面を強制的に更新する場合は、UpdateLayoutを呼び出す必要があります。

于 2010-11-17T14:45:30.603 に答える
-1

DispatcherFrameを試して、DoEventsが実行するフォームをシミュレートした場合はどうなりますか。

System.Security.PermissionsとSystem.Windows.Threadingを含める必要がある場合があります。その後、各スリープ後にDoEvents()を呼び出すと、目的の結果が得られます。

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public void DoEvents()
{
    DispatcherFrame frame = new DispatcherFrame();
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
        new DispatcherOperationCallback(ExitFrame), frame);
    Dispatcher.PushFrame(frame);
}

public object ExitFrame(object f)
{
    ((DispatcherFrame)f).Continue = false;

    return null;
}

MSDNの記事へのリンク:http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.pushframe.aspx

于 2010-11-17T16:51:32.837 に答える