C# 异步线程生存期&;wpfui更新

C# 异步线程生存期&;wpfui更新,c#,wpf,multithreading,task-parallel-library,C#,Wpf,Multithreading,Task Parallel Library,在单击按钮时,我启动了对StartContinuousThread的调用,该调用每秒钟都会对服务器进行轮询 public class ThreadsWindow { CancellationTokenSource wtoken = new CancellationTokenSource(); private void btnStartTest_Click(object sender, RoutedEventArgs e) { StartContinuous

在单击按钮时,我启动了对
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\u单击事件处理程序
完成其执行

StartContinuousThread方法
将如何在这种情况下更新UI 案子

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


请帮忙

如果您的目标是每秒钟轮询一次服务器,那么您会遇到许多问题

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

  • 您可以使用
    Delay
    创建任务,然后忽略它。您应该创建该任务的延续,以完成剩余的工作,实际上一秒钟内什么也不做

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

    private async Task StartContinuousThread(CancellationToken token)
    {
        while (true)
        {
            token.ThrowIfCancellationRequested();
            await Task.Run(() => CallServer());
            await Task.Delay(1000, token);
        }
    }
    
    另一种可能性,特别是如果您使用的是旧版本的C#,则可能是使用计时器每秒运行一些代码


    至于用户界面的更新;您可以在调用
    任务之外的任何地方自由执行此操作。在本例中,请运行
    。在您的示例中,您需要使用某种机制封送回UI线程,例如捕获UI的同步上下文并发布到其中。

    该代码存在一些问题。。你到底想做什么?你想在
    CallServer
    返回后更新UI线程吗?谢谢,请你解释一下如何编组回UI线程。btb我在这里发帖时错过了while loop。@lakshyaleader这是一个广泛讨论的话题,如果你想知道更多,你可以很容易地进行研究。