简单实现异步
在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]";
});
}