我用xaml做了一个小的c#项目。为了在thread函数中每隔1秒在richtextbox中追加文本,我使用了BeginInvoke。但是它在完成线程之后被更新。我需要更新每1秒日志是richtextbox的名称。
private void Worker3()
{
int nCnt = 0;
while(true)
{
nCnt++;
Thread.Sleep(1000);
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)delegate ()
{
Log.AppendText("Updating..." + nCnt.ToString());
}
);
}
}
private void Thread_Click(object sender, RoutedEventArgs e)
{
Thread thread1 = new Thread(new ThreadStart(Worker3));
thread1.Start();
// Wait for the worker thread to finish
thread1.Join();
}
帮帮我谢谢
我希望代码每1秒更新一次。
2条答案
按热度按时间7bsow1i61#
当您在线程上调用
Join
时,它将阻塞,直到该线程完成。这意味着在Join
调用返回之前,UI线程上不能执行任何其他代码,因此所有的BeginInvoke
调用都将排队等待执行,直到线程完成,Join返回并且UI线程再次空闲为止。不要调用Join
。你真的应该学习如何使用任务而不是线程。您可以等待任务而不锁定UI线程。
uelo1irk2#
定期做某事的正确方法是使用 * 计时器 *。如果你使用WPF,你应该使用DispatchTimer来调用UI线程上的事件:
还有其他方法可以处理长时间运行的操作,这些操作会产生结果、进度报告或不断更新的后台线程。但是对于一个简单的“每秒钟更新文本”,调度计时器是正确的解决方案。