Async、Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写
1 await和async配对使用。最典型的应用如下:
下面的代码是不用线程的情况,winform就会在5秒的无响应状态后才会在testbox中显示“test”,用户体验不好。
private string testString()
{
Thread.Sleep(5000);
return "test";
}
private async void btnGetAndTransfer_Click(object sender, EventArgs e)
{
tbTextBox.text=testString();
}
下面的代码使用传统的threading技术更新textbox的内容,非常复杂,代码难于维护
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Thread(SampleFunction).Start();
}
public void SetTextBox(string value)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(SetTextBox), new object[] {value});
return;
}
textBox1.Text = value;
}
void SampleFunction()
{
Thread.Sleep(5000);
SetTextBox("test");
}
}
下面的代码使用await+async实现了第一段代码的功能,并且解决了winform冻结的问题。从代码的结构来说,也是清晰易读。
private async Task<string> testString()
{
return await Task<string>.Run(() =>
{
Thread.Sleep(5000);
return "test";
});
}
private async void btnGetAndTransfer_Click(object sender, EventArgs e)
{
tbTextBox.text=await testString();
}
/
using System;
using System.Globalization;
using System.Threading.Tasks;
namespace asyncTest
{
class Program
{
static string Greeting(string name)
{
Task.Delay(3000).Wait();
return $"Hello,{name}";
}
static Task<string> GreetingAsync(string name)
{
return Task.Run<string>(()=>
{ return Greeting(name); });
}
async static void CallerWithAsync()
{
Console.WriteLine("开始执行await:" + DateTime.Now.ToString("yyyy年MM月dd日hh时mm分ss秒", DateTimeFormatInfo.InvariantInfo));
string result = await GreetingAsync("WPF");
Console.WriteLine(result);
Console.WriteLine(DateTime.Now.ToString("等待结束,开始继续执行 " + "yyyy年MM月dd日hh时mm分ss秒", DateTimeFormatInfo.InvariantInfo));
}
static void Main(string[] args)
{
CallerWithAsync();
Console.ReadLine();
}
}
}