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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值