1、同步和普通异步
/// <summary>
/// 同步执行
/// </summary>
private void Click1()
{
string result = NetRequest();
txt.Text = result;
}
/// <summary>
/// 异步执行
/// </summary>
private void Click2()
{
Thread t = new Thread(() =>
{
string result = NetRequest();
Application.Current.Dispatcher.Invoke(new Action(() =>
{
txt.Text = result;
}));
});
t.IsBackground = true;
t.Start();
}
2、async 和await 必须成对出现,await相当于 单独起一个线程执行代码
/// <summary>
/// 异步执行2
/// 1、async 和await 必须成对出现
/// </summary>
/// <returns></returns>
private async Task Click3()
{
var result = await NetRequestAsync();
txt.Text = result;
}
/// <summary>
/// await 单独起一个线程执行代码
/// </summary>
/// <returns></returns>
private async Task Click31()
{
var result = await NetRequestAsync();
Thread.Sleep(2000);
txt.Text = result;
}
private async Task Click32()
{
var result = await NetRequestAsync();
await Task.Delay(2000);
txt.Text = result;
}
3、await关键字出现异常时会返回当前线程
/// <summary>
/// await关键字出现异常时会返回当前线程
/// </summary>
/// <returns></returns>
private async Task Click4()
{
try
{
var result = await NetRequestAsyncException();
txt.Text = result;
}
catch (Exception ex)
{
txt.Text = ex.Message;
}
}
4、void await是邪恶了,会导致程序崩溃,无法捕获异常
/// <summary>
/// void await是邪恶了
/// </summary>
/// <returns></returns>
private async void Click5()
{
var result = await NetRequestAsync();
txt.Text = result;
}
/// <summary>
/// async void 异常
/// </summary>
/// <returns></returns>
private async void Click51()
{
var result = await NetRequestAsyncException();
txt.Text = result;
}
/// <summary>
/// async await 异常
/// </summary>
/// <returns></returns>
private async Task Click52()
{
var result = await NetRequestAsyncException();
txt.Text = result;
}
5、Result Wait() 阻塞线程,异步当同步用了。同时会导致死锁
/// <summary>
/// 阻塞线程,异步当同步用了。同时会导致死锁
/// </summary>
private async void Click6()
{
var result= NetRequestAsync();
txt.Text = result.Result;
}
6、基础方法
private string NetRequest()
{
Thread.Sleep(5000);
return "接口请求数据";
}
private async Task<string> NetRequestAsync()
{
await Task.Delay(5000);
return "接口请求数据";
}
private async Task<string> NetRequestAsyncException()
{
await Task.Delay(5000);
throw new Exception("接口调用异常");
return "接口请求数据";
}
对应视频教程:https://www.bilibili.com/video/BV1Jc411x7gq/?vd_source=1d59adf2674b402e784abdc53c264b14