异步线程生存期&WPF UI更新

本文关键字:UI 更新 WPF 线程 生存期 异步 | 更新日期: 2023-09-27 17:52:51

On button click我已经触发了对StartContinuousThread的调用,它每秒钟轮询一次服务器。

public class ThreadsWindow
{
    CancellationTokenSource wtoken = new CancellationTokenSource();
    private void btnStartTest_Click(object sender, RoutedEventArgs e)
    {
        StartContinuousThread();
    } 
    void StartContinuousThread()
    {
        while(true)
        {
            var fact = Task.Factory.StartNew(() =>
            {
                CallServer();
                Task.Delay(1000, wtoken.Token);
            },
            wtoken.Token);
        }
     }
}

StartContinuousThread开始执行,但btnStartTest_Click event handler结束执行。

StartContinuousThread method如何能够在此更新UI案例?

我想知道StartContinuousThread是否也终止与事件处理程序,因为没有等待关键字重新加入。

请帮忙!

异步线程生存期&WPF UI更新

如果您的目标是每秒轮询服务器,那么您将遇到许多问题。

  1. 没有循环。方法执行一次,然后停止。

  2. 使用Delay创建任务,然后忽略它。你应该创建一个任务的延续来完成剩下的工作,而不是在一秒钟内做任何事情。

下面是解决这些问题的实现:

private async Task StartContinuousThread(CancellationToken token)
{
    while (true)
    {
        token.ThrowIfCancellationRequested();
        await Task.Run(() => CallServer());
        await Task.Delay(1000, token);
    }
}

另一种可能性,特别是如果你使用的是旧版本的c#,可以使用计时器来每秒运行一些代码。

对于UI的更新;在本例中,您可以在Task.Run调用之外的任何地方自由地执行此操作。在您的示例中,您需要使用一些机制来封送回UI线程,例如捕获UI的同步上下文并向其发送。