• WPFDispatcher示例


    Dispatcher 类提供用于管理线程工作项队列的服务。

    效果演示:

    <Window x:Class="WPF之Dispatcher对象.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="427" Width="576">
        <Grid Background="BurlyWood" Height="399" Width="557">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="184*" />
                <ColumnDefinition Width="172*" />
                <ColumnDefinition Width="147*" />
            </Grid.ColumnDefinitions>
         
            <Label Content="vlue:0" FontSize="30" Height="55" Margin="125,10,162,0" Name="label1" VerticalAlignment="Top" Grid.ColumnSpan="3" />
            <Button Content="Dispatcher 回调界面线程" Height="46" Margin="125,0,117,157" Name="button1" VerticalAlignment="Bottom" Grid.ColumnSpan="3" Click="button1_Click" />
            <Button Content="直接更新UI界面线程" Height="46" Margin="125,0,117,209" Name="button2" VerticalAlignment="Bottom" Grid.ColumnSpan="3" Click="button2_Click" />
            <Button Content="同步更新UI界面线程" Height="46" Margin="125,0,117,105" Name="button3" VerticalAlignment="Bottom" Grid.ColumnSpan="3" Click="button3_Click" />
            <Button Content="异步更新UI界面线程" Height="46" Margin="125,0,117,53" Name="button4" VerticalAlignment="Bottom" Grid.ColumnSpan="3" Click="button4_Click" />
            <ProgressBar Height="32" Margin="125,97,0,0" Name="progressBar1" VerticalAlignment="Top" Grid.ColumnSpan="3" HorizontalAlignment="Left" Width="315" />
            <Label Content="Dispatcher 应用" FontSize="24" Height="41" Margin="157,-142,135,0" Name="label3" VerticalAlignment="Top" Grid.ColumnSpan="3" />
        </Grid>
    </Window>

    后台简答代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Threading;
    
    namespace WPF之Dispatcher对象
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void button2_Click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    this.label1.Content = "value:" + i+"%";
                    this.progressBar1.Value = i;
                    System.Threading.Thread.Sleep(100);
    
                    //不能引用  System.Windows.Forms中的DoEvents会降低性能
                    System.Windows.Forms.Application.DoEvents();
                   
                }
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    this.label1.Content = "value:" + i+"%";
                    this.progressBar1.Value = i;
                    System.Threading.Thread.Sleep(100);
                    this.DoEvents();//调用扩展方法DoEvents刷新界面同步
                }
            }
            public delegate void delegateUI(string val);
            public void RefashUI(string val)
            {
                this.label1.Content = "value:" + val+"%";
                this.progressBar1.Value = int.Parse(val);
              
            }
    
            private void button3_Click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    this.Dispatcher.Invoke(new delegateUI(RefashUI), //同步执行
                        DispatcherPriority.Normal, //优先级设置
                        new string[] { i.ToString() });
                    System.Threading.Thread.Sleep(100);
                    this.DoEvents();
                }
    
            }
            private void button4_Click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    this.Dispatcher.BeginInvoke(new delegateUI(RefashUI),//异步执行
                        DispatcherPriority.Normal,
                        new string[] { i.ToString() });
                    System.Threading.Thread.Sleep(100);
                    this.DoEvents();
    
                    //也可以用这种方法启动线程,设置线程优先级
                    //this.Dispatcher.Thread.Start();
                    //this.Dispatcher.Thread.Priority = System.Threading.ThreadPriority.Highest;
                }
            }
        }
    
        //一个扩展的自定义DoEvents,可以直接使用我们的项目中
        public static class WindowEX
        {
            public static void DoEvents(this MainWindow win)
            {
                DispatcherFrame frame = new DispatcherFrame();
                Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
                    new DispatcherOperationCallback(ExitFrames), frame);
                Dispatcher.PushFrame(frame);
            }
    
            public static object ExitFrames(object f)
            {
                ((DispatcherFrame)f).Continue = false;
                return null;
            }
    
        }
    }


    上面展示了Dispatcher对象简单的运用,更多的用法http://msdn.microsoft.com/zh-cn/library/vstudio/System.Windows.Threading.Dispatcher.aspx

    下载:http://files.cnblogs.com/BABLOVE/WPF%E4%B9%8BDispatcher%E5%AF%B9%E8%B1%A1.rar

  • 相关阅读:
    form表单提交方式
    docker overlay2 目录下文件夹占用空间过大
    基本操作:vscode快捷键
    基本操作:vscodegit使用和命令
    关闭win10“快速启动”功能
    在CentOS 7.4下配置VNC Server服务
    golang 百分比抽奖几率
    对新闻客户端APP的性能优化实战
    性能优化专题 OOM 与 内存优化
    centos 安装谷歌浏览器和selenium环境 李刚
  • 原文地址:https://www.cnblogs.com/BABLOVE/p/3236053.html
Copyright © 2020-2023  润新知