0

アプリで Dispatcher を使用したいのですが、これは私のコードを実行しません

 private void LoadPage()
        {
            Dispatcher.BeginInvoke(() =>
                    {
                        TextBlock temp = new TextBlock();
                        temp.TextWrapping = TextWrapping.Wrap;
                        temp.TextAlignment = TextAlignment.Right;
                        temp.FontSize = 32;
                        temp.Text = "";
                        for (int i = 0; i < word.Length; i++)
                        {
                            temp.Text = temp.Text + " " + word[i];
                            temp.UpdateLayout();
                            temp.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                            if (temp.ActualHeight < 600)
                                text = text + " " + word[i];
                            else
                            {
                                pages.Add(text);
                                temp.Text = "";
                                text = "";
                            }
                        }
                        if (text != "")
                            pages.Add(text);
                    });
        }

これを実行するには、このコードを使用します

Thread t = new Thread(new ThreadStart(LoadPage));
                t.Start();

                while (pages.Count == 0)
                {
                    if (!t.IsAlive)
                        break;
                }

ただし、while ループからの 2 回目のブレーク後は常に、Thread と Dispatcher がなければ、アプリは正常に動作し、間違いを犯しても問題はありませんか? わからない :(

4

2 に答える 2

1

アプリがどのように機能するか

UI Thread       | Second thread
====================================   
create and run  |
thread          |
---------------------------------------
waiting         | shedule your dispatcher code 
                | for executing on ui thread
------------------------------------------              
waiting         | finishing (t.IsAlive now is true)
------------------------------------------
waiting count=0 |
....
waiting count=0 |
....            |
(until End      |
of the World)   |

Dispatcher に渡された Lambda は実行されませんでした。

問題は、Dispatcher がコードを並行して実行せず、UI スレッドで実行するコードをスケジュールするため、現在の UI スレッド タスクが終了した後にのみ実行されることです (この場合は while ループです)。

ほとんどの場合、タスクは小さいため、並列作業の錯覚を生み出しますが、それは単に 1 つずつ実行されるデリゲートのキューです。

それを修正する方法を知るには、あなたが何を達成したいのかを正確に知る必要があります. スレッドと待機ループの代わりにディスパッチャ コードを配置できないのはなぜですか?

于 2013-02-09T20:01:30.520 に答える
0

あなたのコードはあまり意味がありません。スレッドを開始し、すぐに UI スレッドにマーシャリングします。UI スレッドの外部でコードを実行できるようには見えないため、新しいスレッドを開始して何を達成しようとしているのかが明確ではありません。

スレッドの仕組みについても少し混乱していると思います。コードは、スレッドが開始される前に while ループの実行を開始することもできます。つまり、簡単に呼び出しt.Start()て、呼び出される前に while ループに入ることができますLoadPage

于 2013-02-09T19:47:53.637 に答える