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 循环第二次中断但没有 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)   |

Lambda,传递给 Dispatcher,从未执行。

问题是 Dispatcher 不会并行执行代码,它会调度代码以在 UI 线程上执行,因此只有在当前 UI 线程任务完成后才会执行(在您的情况下,它是一个 while 循环)。

因为在大多数情况下任务很小,它会产生并行工作的错觉,但它只是一个委托队列,一个一个执行。

要知道如何修复它,我需要知道你想要实现什么,因为我不理解这段代码的整个想法。为什么不能放置调度程序代码而不是线程和等待循环?

于 2013-02-09T20:01:30.520 回答
0

您的代码实际上没有多大意义。您正在启动一个线程,然后立即编组回 UI 线程。看起来您的任何代码都不能在 UI 线程之外执行,因此不清楚您要尝试实现什么来启动新代码。

我怀疑您对线程的工作方式也有些困惑。你的代码很可能在你的线程开始之前就开始执行while循环——即它可以很容易地调用t.Start(),然后在LoadPage调用之前进入while循环。

于 2013-02-09T19:47:53.637 回答