XAML 在C#中使用线程更新文本框

tpxzln5u  于 2023-05-21  发布在  C#
关注(0)|答案(2)|浏览(153)

我用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秒更新一次。

7bsow1i6

7bsow1i61#

当您在线程上调用Join时,它将阻塞,直到该线程完成。这意味着在Join调用返回之前,UI线程上不能执行任何其他代码,因此所有的BeginInvoke调用都将排队等待执行,直到线程完成,Join返回并且UI线程再次空闲为止。不要调用Join
你真的应该学习如何使用任务而不是线程。您可以等待任务而不锁定UI线程。

uelo1irk

uelo1irk2#

定期做某事的正确方法是使用 * 计时器 *。如果你使用WPF,你应该使用DispatchTimer来调用UI线程上的事件:

dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();

...
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    nCnt++;
    Log.AppendText("Updating..." + nCnt.ToString()); 
}

还有其他方法可以处理长时间运行的操作,这些操作会产生结果、进度报告或不断更新的后台线程。但是对于一个简单的“每秒钟更新文本”,调度计时器是正确的解决方案。

相关问题