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 )
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