如果想在异步方法中暂停一段时间,不要用Thread.Sleep(),因为它会阻塞调用线程,而要用await Task.Delay()。
举例:下载一个网址,5秒后下载另一个。
1.新建一个winform项目。
2.使用“Thread.Sleep(5000)”。
private async void button1_Click(object sender, EventArgs e)
{
using (HttpClient httpClient = new HttpClient())
{
string b = await httpClient.GetStringAsync("https://www.bilibili.com");
textBox1.Text = b.Substring(0, 100);
textBox1.Focus();
//卡顿,最后把下载内容同步写入文本框
Thread.Sleep(5000);
string baidu = await httpClient.GetStringAsync("https://www.baidu.com/");
textBox2.Text = baidu.Substring(0,100);
textBox2.Focus();
}
}
3.运行代码,点击“下载”按钮,窗体会卡住5秒无法拖动。
4.使用“await Task.Delay(5000)”。
private async void button1_Click(object sender, EventArgs e)
{
using (HttpClient httpClient = new HttpClient())
{
string b = await httpClient.GetStringAsync("https://www.bilibili.com");
textBox1.Text = b.Substring(0, 100);
textBox1.Focus();
//不卡顿
await Task.Delay(5000);
string baidu = await httpClient.GetStringAsync("https://www.baidu.com/");
textBox2.Text = baidu.Substring(0,100);
textBox2.Focus();
}
}
5.运行代码,点击“下载”按钮,窗体不会卡住,可以正常拖动。
在控制台中无法看到区别,但是放到WinForm程序中就能看到区别了。 ASP.NET Core中也看不到区别,但是Sleep()会降低并发。就像去餐厅点餐,“Thread.Sleep(5000)”是服务员一直等着你点餐,再去服务别的客人,而 “await Task.Delay(5000)”是你自己再犹豫决定,服务员可以正常提供服务。