首先更深入的原理知识请移步:https://blog.csdn.net/WPwalter/article/details/78093917
这里主要用上几个实例。总结一下:
1.BeginInvoke和InvokeAsync原理一致,可取得一致的结果,用InvokeAsync会更实用方便,因为可以直接用上Action和Fun方法。
2.Invoke会阻塞线程,直到Invoke里的代码完成,InvokeAsync和BeginInvoke会直接运行后面的代码。
来看一个简单的实例:
private void btn_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(DoSomeThing);
t.Start();
lable.Content= "1";
this.Dispatcher.Invoke(() => { lable.Content += "2";Thread.Sleep(2000); });
lable.Content += "3";
}
private void DoSomeThing()
{
for(int i=0;i<10;i++)
{
this.Dispatcher.Invoke(()=> { lable.Content += i.ToString(); });
Thread.Sleep(1000);
}
}
结果是:
可以发现,先执行Invoke,然后执行Thread里的内容。
接下来,把Invoke换成InvokeAsync。
private void btn_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(DoSomeThing);
t.Start();
lable.Content= "1";
this.Dispatcher.InvokeAsync(() => { lable.Content += "2";Thread.Sleep(2000); });
lable.Content += "3";
}
会发现结果变了。3在前,2在后,也就是说先执行了InvokeAsync。
接着再把DoSomeThing的Invoke也改成InvokeAsync,最后会发现结果中0变成了1,这是因为这里的进程在排队,先结束了btn_click里的InvokeAsync,然后再来执行DoSomeThing里的InvokeAsync,而此时i的值已经变成了1。
private void DoSomeThing()
{
for(int i=0;i<10;i++)
{
this.Dispatcher.InvokeAsync(()=> { lable.Content += i.ToString(); });
Thread.Sleep(1000);
}
}