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

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

posted @ 2013-08-04 11:02  如梦不是梦  阅读(583)  评论(0编辑  收藏  举报