打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Dispatcher.Invoke and Dispatcher.BeginInvoke
心如止水

Dispatcher.Invoke and Dispatcher.BeginInvoke

Dispatcher.Invoke是同步执行,msdn描述:

Executes the specified delegate with the specified arguments synchronously on the thread the Dispatcher is associated with.

返回值是object, 是被调用的委托的返回值,如果该委托没有返回值,则为null。它有好几个重载方法,下面是其中之一:

public Object Invoke(	Delegate method,	paramsObject[] args)

Invoke is a synchronous operation; therefore, control will not return to the calling object until after the callback returns.

---------------------------------------------------------------------------------------------------------------------------------

Dispatcher.BeginInvoke是异步执行,msdn描述:

Executes the specified delegate asynchronously with the specified arguments on the thread that the Dispatcher was created on.

返回值是DispatcherOperation, An object, which is returned immediately after BeginInvoke is called, that can be used to interact with the

delegate as it is pending execution in the event queue. 它有好几个重载方法,下面是其中之一:

public DispatcherOperation BeginInvoke(	Delegate method,	params Object[] args)
不同点是Dispatcher.Invoke直到回调返回之后才将控制权返回给调用对象。Dispatcher.BeginInvoke是立即返回控制权给调用对象,只是把delegate加到消息循环中。
如下面的例子:
private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Test1();
            Test2();
            Test3();
        }
        private void Test1()
        {
            // 同步的按代码顺序执行
            Dispatcher.Invoke(new Action<string>(Console.WriteLine), System.Windows.Threading.DispatcherPriority.SystemIdle, "Invoke 1");
            Dispatcher.Invoke(new Action<string>(Console.WriteLine), System.Windows.Threading.DispatcherPriority.Send, "Invoke 2");
            // 以下3个异步,
            Dispatcher.BeginInvoke(new Action<string>(Console.WriteLine), System.Windows.Threading.DispatcherPriority.Normal, "BeginInvoke 1");
            Dispatcher.BeginInvoke(new Action<string>(Console.WriteLine), System.Windows.Threading.DispatcherPriority.Send, "BeginInvoke 2");
            // 异步默认的DispatcherPriority是Normal
            DispatcherOperation dop = Dispatcher.BeginInvoke(new Action<string>(Console.WriteLine), "BeginInvoke 3");
            Console.WriteLine("dop.Priorty: " + dop.Priority.ToString());
            Console.WriteLine("Hello normal");
        }
        private void Test2()
        {
            Dispatcher.BeginInvoke(new Action(() => MessageBox.Show("Invoke 1: Hello world")));
            MessageBox.Show("Invoke 2: Hello world");
        }
        private void Test3()
        {
            Dispatcher.BeginInvoke(new Action(() => { MessageBox.Show("hello 1"); }), System.Windows.Threading.DispatcherPriority.Background);
            MessageBox.Show("hello 2");
        }

输出结果:

Invoke 1
 Invoke 2
 dop.Priorty: Normal
 Hello normal
 BeginInvoke 2
 BeginInvoke 1
 BeginInvoke 3

分类: WPF
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WPF的线程模型
WPF线程模型及委托事件应用
C#基础(2)
委托入门(第一章)
【   】【转帖】谈C#中的Delegate
详解WPF线程模型和Dispatcher
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服