我想在我的应用程序中使用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循环中第二次休息之后 但没有线程和调度程序我的应用程序工作良好,没有任何问题 哪里我搞错了?我不知道:(
答案 0 :(得分: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循环)。因为在大多数情况下,任务很小,它会产生并行工作的错觉,但它只是一个代表队列,一个接一个地执行。
要知道如何修复它我需要知道你想要实现什么,因为我不会理解这个代码的整个想法。 为什么你不能把你的调度程序代码而不是线程和等待循环?
答案 1 :(得分:0)
你的代码没有多大意义。您正在启动一个线程,然后立即编组回UI线程。看起来你的任何代码都不能在UI线程之外执行,因此不清楚你想要创建一个新的代码。
我怀疑你对线程如何工作也有点困惑。您的代码可能会在您的线程开始之前开始执行while循环 - 也就是说它可以轻松调用t.Start()
然后在调用LoadPage
之前进入while循环。