WPF-基础-02 DispatcherObject类

csharp 复制代码
   public abstract class DispatcherObject
{
    protected DispatcherObject();
    public Dispatcher Dispatcher { get; }
    public bool CheckAccess();
    public void VerifyAccess();
}

WPF中使用Dispatcher更新界面

csharp 复制代码
xaml
    <Grid>
        <TextBlock x:Name="tbkShow" HorizontalAlignment="Center" Margin="0,120,0,0" VerticalAlignment="Top"/>
        <Button x:Name="btnLogin" Click="btnLogin_Click" Content="登录" Margin="0,88,0,0" VerticalAlignment="Top" Width="75" Height="23"/>
    </Grid>
C#
形式一 (Thread )
        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            Thread thread = new Thread(Login);
            thread.Start();
        }
        private void Login() 
        {
            for (int i = 0; i < 30; i++)
            {
                Thread.Sleep(100);
                //利用Dispatcher更新主界面控件属性
                this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate {
                    btnLogin.Content = i + "s";
                    if (i == 29)
                        btnLogin.IsEnabled = true;
                });
            }
        }
形式二 (Task.Run)       
        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            Task.Run(() =>
            {
                // 需要更新UI的操作
                Dispatcher.Invoke(() =>
                {
                    // 在UI线程上更新UI元素
                    btnLogin.Content = "点击登录后";
                });

            });
        }  
形式三 (Task.Factory)          
        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            Task.Factory.StartNew(() =>
            {
                Task.Delay(100).Wait();

                Dispatcher.Invoke(() =>
                {
                    btnLogin.Content = "登录成功";
                });
            });
        }
形式四 (参数行为new Action())        
        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            Thread thread = new Thread(Login);
            thread.Start();
        }
        private void Login() 
        {

            //利用Dispatcher更新主界面控件属性
            //Application.Current.Dispatcher.BeginInvoke()
            Dispatcher.BeginInvoke(DispatcherPriority.Normal,

                new Action(() =>
                {
                    Thread.Sleep(100);
                    this.btnLogin.Content = DateTime.Now.ToString();

                }));
        } 
形式五  (BeginInvoke 返回DispatcherOperation执行Completed)        
        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
          Thread thread = new Thread(Login);
          thread.Start();
        }
        private void Login() 
        {

            //利用Dispatcher更新主界面控件属性
            //Application.Current.Dispatcher.BeginInvoke()
           var task=  Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,

                new Action(() =>
                {
                    Thread.Sleep(100);
                    this.btnLogin.Content = DateTime.Now.ToString();

            }));
            task.Completed += new EventHandler(task_Completed);
        }
        private void task_Completed(object sender, EventArgs e)
        {
            MessageBox.Show("任务已经完成");
        }
        private void Login() 
        {
         double i = 0d;
         for (i = 0d; i < 800d; i++)
          {
          Task.Delay(5).Wait();
          Action act = () => rect.Width++;
          Dispatcher.BeginInvoke(act, DispatcherPriority.Background);
         }
        }
}             
csharp 复制代码
DispatcherPriority枚举值
Invalid = -1,
Inactive = 0,
SystemIdle = 1,
ApplicationIdle = 2,
ContextIdle = 3,
Background = 4,
Input = 5,
Loaded = 6,
Render = 7,
DataBind = 8,
Normal = 9, 以正常优先级将工作项目调度到 UI 线程。这是调度大多数应用程序工作项目时的优先级
Send = 10 以最高优先级将工作项目调度到 UI 线程
public sealed class Dispatcher
{
//同步
public void Invoke(Action callback);
public void Invoke(Action callback, DispatcherPriority priority);
public void Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken);
public void Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken, TimeSpan timeout);
public object Invoke(Delegate method, params object[] args);
//异步
public DispatcherOperation BeginInvoke(Delegate method, params object[] args);
public DispatcherOperation BeginInvoke(Delegate method, DispatcherPriority priority, params object[] args);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg, params object[] args);
}
相关推荐
samble20 小时前
从零搭建半导体设备上位机(九):拖拽与交互,Adorner、DragDrop 与晶圆拖放信息
wpf·拖拽·adorner
郝学胜-神的一滴2 天前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn
波力海苔夹心脆6753 天前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
陈仓主教3 天前
# WPF CheckBox 控件详解与使用—WPF 中的控件(6)--复选框控件(CheckBox)
wpf
光泽雨5 天前
WPF 音视频四大核心方案对比
wpf·音视频
浪扼飞舟6 天前
WPF(数据绑定)
wpf
samble7 天前
从零搭建半导体设备上位机(四):单实例、启动流程与配置文件,App 里那 526 行到底在干什么
wpf·配置文件·单实例
浪扼飞舟7 天前
WPF(控件的继承树、内容控件、布局控件)
wpf
avi911110 天前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
吾与谁归in11 天前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf