簡體   English   中英

WPF多線程屬性更新無法正常工作

[英]WPF multithreading property update does not work async

今天,我將嘗試了解WPF中的多線程過程。 所以我做了一個很小的WPF應用程序,它只有一個窗口。 在窗口中,您將找到一個按鈕和一個文本框-其他:

<Window x:Class="Multithreading.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" />
    <TextBox Height="23" Name="txtCounter" VerticalAlignment="Top" Width="120" />
</Grid>

好的-讓我們看看我的點擊事件:

private void button1_Click(object sender, RoutedEventArgs e)
    {
        ThreadStart ts = delegate
        {
            Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(Threddy));
        };
        new Thread(ts).Start();
    }

如您所見,有一個委托方法“ Threddy”:

public void Threddy()
    {
        for (int i = 0; i < 10000; i++)
        {
            txtCounter.Text = "" + i;
        }
    }

我希望現在可以清楚地知道我要做什么:如果用戶單擊該按鈕,則應該啟動一個新線程,這將更改我的文本框的文本。 但不幸的是,文本僅更改了一次:最后。

所以-我在做什么錯? 謝謝你的幫助!

食人魔

認為您在將線程異步啟動與發布線程異步代碼混淆了。
您要啟動另一個線程,然后從該線程更新UI線程上的控件。 WPF不允許您從另一個線程更新在UI線程上創建的控件,因此您將不得不使用分派器將控件更新代碼發布到UI線程。 這是Theddy中的Dispatcher包裝器。

private void button1_Click(object sender, RoutedEventArgs e) {
    ThreadStart ts = new ThreadStart(Threddy);
    new Thread(ts).Start();
}  

public void Threddy() {
    for (int i = 0; i < 10000; i++){
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
            txtCounter.Text = "" + i;
        }));
    }
}

請注意,在循環內您可以BeginInvoke或Invoke。
前者(BeginInvoke)意味着Threddy循環將繼續運行,並且不等待UI更新-將會發生(UI更新),但循環不在等待它。 UI和循環計數器都在進行,但不一定同步。
稍后的(調用)意味着循環的每次執行都將等待,直到UI控件實際上已被更新為止。 UI和循環計數器已同步。

暫無
暫無

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

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