WPF 后台线程操作界面元素不卡UI界面线程 Dispatcher

经常要考虑的,后台的耗时操作不要卡死主界面的问题。

<StackPanel VerticalAlignment="Center">
    <Label x:Name="lblHello">欢迎你光临WPF的世界!</Label>
    <Button Name="btnThd" Click="btnThd_Click" >多线程同步调用</Button>
    <Button Name="btnAppBeginInvoke" Click="btnAppBeginInvoke_Click" >BeginInvoke 异步调用</Button>
</StackPanel>

Behind Code:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ModifyUI()
    {
        //// 模拟一些工作正在进行
        //Thread.Sleep(TimeSpan.FromSeconds(2));
        //lblHello.Content = "欢迎你光临WPF的世界,Dispatcher";

        // 模拟一些工作正在进行
        Thread.Sleep(TimeSpan.FromSeconds(3));
        this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate ()
        {
            lblHello.Content = "欢迎你光临WPF的世界,Dispatche  同步方法 !!";
        });
    }

    private void btnThd_Click(object sender, RoutedEventArgs e)
    {
        Thread thread = new Thread(ModifyUI);
        thread.Start();
    }

    private void btnAppBeginInvoke_Click(object sender, RoutedEventArgs e)
    {
        new Thread(() =>
        {
            Thread.Sleep(TimeSpan.FromSeconds(3));
            Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                new Action(() =>
                {
                    //Thread.Sleep(TimeSpan.FromSeconds(3)); // 放这里还是会卡 UI 界面线程
                    this.lblHello.Content = "欢迎你光临WPF的世界,Dispatche 异步方法!!" + DateTime.Now.ToString();
                }));
        }).Start();
    }
}

这样调用,是不会卡主界面的。




参考:

https://www.cnblogs.com/chillsrc/p/4482691.html

posted @   double64  阅读(389)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示