简单实现异步

在C#中,与异步有关的两个关键字是asyncawait
async用于修饰方法、事件处理器,await用于调用方法。

举个简单的栗子:

  1. //异步执行的Button_Click事件
  2. private async void Button_Click(object sender, RoutedEventArgs e)
  3. {
  4. //执行异步方法
  5. await Foo();
  6. var a = 1;
  7. var b = a++;
  8. }
  9. //异步方法
  10. private static async Task Foo()
  11. {
  12. MessageBox.Show("async");
  13. }

异步原理

在Windows中,有多个进程,每个进程中可以有多个线程。在线程中,则可以有多个协程。异步执行的代码就叫协程。

在一个线程中,有一个调度器,负责执行队列中的任务队列中的任务称为协程

在同步执行代码时,调度器会将同步的代码块一直执行下去,直到结束。

在异步执行代码时,则会有所变化。
以上述代码为例,如果执行到第5行时,队列中会添加“执行Foo()方法”和“执行完Foo()方法后,继续从第6行执行”两个任务。
此时,调度器会继续执行队列中的任务,等到执行到“执行Foo()方法”时,就会开始调用Foo()方法内的内容,随后再返回到第6行,继续执行剩余代码。

其他问题

  1. //异步执行的Button_Click事件
  2. private async void Button_Click(object sender, RoutedEventArgs e)
  3. {
  4. //不await异步方法
  5. Foo();
  6. var a = 1;
  7. var b = a++;
  8. }
  9. //异步方法
  10. private static async Task Foo()
  11. {
  12. MessageBox.Show("async");
  13. }

如果不在异步方法前添加await关键字,则队列中会添加“执行Foo()方法”,之后则会继续执行第6行代码,直到调度器执行到队列中的“执行Foo()方法”,才执行第13行的代码。

举个栗子:
异步.gif
上图方法的代码:

  1. private async Task TB1_Change()
  2. {
  3. await Task.Delay(delayTime);
  4. this.Dispatcher.Invoke(() =>
  5. {
  6. TB1.Text += "[change TB1]";
  7. });
  8. }