1

次のメソッドは、2番目のメソッド(DoWork)が終了するまで、wpfの変更(background = red)を適用しません。

private void change()
{
    Background = Brushes.Red;
    Dispatcher.BeginInvoke((Action) DoWork);
}

DoWork()の実行には数秒かかりますが、このコードは複数の場所で使用され、さまざまな間隔でDispatcherスレッドと相互作用する可能性があるため、スレッドに入れたくありません。Invalidate ...()メソッドを呼び出してみましたが、役に立ちませんでした。BeginInvoke()が追加され、ロジックが呼び出される前に遅延によってバックグラウンド変更を適用できるかどうかを確認しました。通常、ロジックはこのメソッドの一部になります。ところで、ほとんどのロジックは別のスレッドで実行され、ディスパッチャースレッドをブロックするべきではありませんか?!

誰か助けてもらえますか?ありがとう

4

3 に答える 3

3

「ディスパッチャ」スレッドは UI スレッドです。

を呼び出すと、UI スレッドで実行されているため、Dispatcher.BeginInvoke((Action) DoWork);基本的に終了するまで UI スレッドをブロックしています。DoWork

これにより、UI が更新されなくなり、背景の変更が表示されなくなります。

DoWorkThreadPool を直接使用するか、BackgroundWorker を使用するか、その他の手段を使用して、バックグラウンド スレッドに移行することを検討する必要があります。これにより、この問題は完全に修正され、「数秒間」UI スレッドがブロックされるのを防ぐことができます (これは、ディスパッチャーのスレッドを使用してこれを実行した場合に発生します)。

于 2010-04-13T16:21:27.517 に答える
0

BeginInvoke(..) メソッドは呼び出しをブロックしませんが、単に新しいメッセージをキューに入れ、ディスパッチャ スレッドで処理します。投稿したコードでは、DoWorks が起動する前に背景色の変更が処理されるという保証はありません。

バックグラウンドが最初に変更されるように、DoWork 呼び出しの優先度を下げることができます。

        private void Button_Click(object sender, RoutedEventArgs e)
    {
        grid.Background = new SolidColorBrush(Colors.Red);
        Dispatcher.BeginInvoke((Action)DoWork, DispatcherPriority.ContextIdle);
    }

    private void DoWork()
    {
        Thread.Sleep(1000);
        btn.Content = "Done";
    }

しかし、これは人類に知られている最善の解決策ではありません。

別のスレッドで DoWork を続行することをお勧めします。上記のスレッド アプローチを使用した例は、次のようになります。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        grid.Background = new SolidColorBrush(Colors.Red);

        Task t = new Task(DoWork);
        t.Start();
    }

    private void DoWork()
    {
        Thread.Sleep(1000);
        // Synchronize calls to the UI elements
        Application.Current.Dispatcher.BeginInvoke((Action)(() => { btn.Content = "Done"; }));

    }

UI 要素に対するすべての操作を UI スレッドに投稿することを忘れないでください。

于 2012-12-22T13:17:59.340 に答える
0

スレッド間の通信のためにDispatcher、WPF にクラスがあります。

Dispatcher.Invoke(DispatcherPriority.Normal, (NoArgDelegate)delegate
            {
                ------
            });
于 2010-05-20T23:30:43.117 に答える