簡體   English   中英

異步線程生存期和WPF UI更新

[英]Asynchronous Thread Lifetime & WPF UI Update

在按鈕上單擊,我已經激發了對StartContinuousThread調用,該調用持續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是否也用事件處理程序終止了,因為沒有等待重新連接的關鍵字。

請幫忙!

如果您的目標是每秒輪詢服務器,那么您會遇到很多問題。

  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的同步上下文並將其發布到其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM