简单实现异步
在C#中,与异步有关的两个关键字是async和await。async用于修饰方法、事件处理器,await用于调用方法。
举个简单的栗子:
//异步执行的Button_Click事件private async void Button_Click(object sender, RoutedEventArgs e){//执行异步方法await Foo();var a = 1;var b = a++;}//异步方法private static async Task Foo(){MessageBox.Show("async");}
异步原理
在Windows中,有多个进程,每个进程中可以有多个线程。在线程中,则可以有多个协程。异步执行的代码就叫协程。
在一个线程中,有一个调度器,负责执行队列中的任务,队列中的任务称为协程。
在同步执行代码时,调度器会将同步的代码块一直执行下去,直到结束。
在异步执行代码时,则会有所变化。
以上述代码为例,如果执行到第5行时,队列中会添加“执行Foo()方法”和“执行完Foo()方法后,继续从第6行执行”两个任务。
此时,调度器会继续执行队列中的任务,等到执行到“执行Foo()方法”时,就会开始调用Foo()方法内的内容,随后再返回到第6行,继续执行剩余代码。
其他问题
//异步执行的Button_Click事件private async void Button_Click(object sender, RoutedEventArgs e){//不await异步方法Foo();var a = 1;var b = a++;}//异步方法private static async Task Foo(){MessageBox.Show("async");}
如果不在异步方法前添加await关键字,则队列中会添加“执行Foo()方法”,之后则会继续执行第6行代码,直到调度器执行到队列中的“执行Foo()方法”,才执行第13行的代码。
举个栗子:
上图方法的代码:
private async Task TB1_Change(){await Task.Delay(delayTime);this.Dispatcher.Invoke(() =>{TB1.Text += "[change TB1]";});}
