UI设计:一个Button和一个文本框
假如设计Button点击后执行异步等待5秒,期望在等待期间更新Text Box文本信息。
测试代码1:
private async void btnAsyncWait_Click(objectsender,RoutedEventArgs e)
{
awaitTask.Delay(5000);
txtWait5s.Text = “异步等待5秒”;
}
实际并没有在等待5秒的期间更新文本信息,而是等待5秒后,才更新的文本信息,这不是我们期望的状态。
最终状态:
测试代码2:
private async void btnAsyncWait_Click(objectsender,RoutedEventArgs e)
{
await this.txtWait5s.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,new Action(async() =>
{
for (inti = 0; i <= 5; i++)
{
txtWait5s.Text =i.ToString();
awaitTask.Delay(1000);
}
}));
txtWait5s.Text =“异步等待5秒”;
}
代码2和预期的行为一致,await执行立即返回的,所以文本框显示"异步等待5秒",异步等待中每隔一秒更新一次文本框,所以文本框动态显示1,2,3,4,5,最终显示5.可以不显示更新数字5,这个等待是异步的,所以文本直接被更新为"异步等待5秒",异步等待并不阻塞UI线程。
2. 获取异步函数的结果
================
测试代码1:
创建以异步函数,模拟计算1到100的求和,模拟耗时,所以每次循环延时0.01秒
static async Task Cal_Async()
{
intsum = 0;
for (inti = 0; i <= 100; i++)
{
sum += i;
awaitTask.Delay(1);
}
returnsum;
}
private async voidbtnGetAsynResult_Click(objectsender, RoutedEventArgs e)
{
var t = await Cal_Async();
txtAsyncResult.Text = t.ToString();
}
异步调用该函数,获取该函数的返回值,和预期的一样 5050.
使用async 和await 关键字,代码和正常的流程结构一样。
测试代码2:
这和编写同步方法方式一样,使用await后,C#立即创建一个任务
无延时,同步方式执行
static async Task Cal_Async()
{
intsum = 0;
for (inti = 0; i <= 100; i++)
{
sum += i;
}
returnsum;
}
static asyncTaskRun_Asyn(TextBox txt)
{
try
{
var t = await Cal_Async();
txt.Text = t.ToString();
}
catch(Exception ex)
{
txt.Text = ex.Message;
}
}
封装一下方法,再调用
private async voidbtnGetAsynResult_Click(objectsender, RoutedEventArgs e)
{
vart = Run_Asyn(txtAsyncResult);
t.Wait();
}
显示结果一样5050.
测试代码3:
static async Task Get_Infos()
{
await Task.Delay(1000);
return $“Thread ID: {Thread.CurrentThread.ManagedThreadId}”;
}
调用1:
private async voidbtnGetAsynResult_Click(objectsender, RoutedEventArgs e)
{
awaitTask.Delay(100);
var t = awaitGet_Infos();
txtAsyncResult.Text = t.ToString();
}
调用方式2:
private async voidbtnGetAsynResult_Click(objectsender, RoutedEventArgs e)
{
await Task.Delay(100);
vart = Get_Infos();
while(!t.IsCompleted)
{
await Task.Delay(10);
}
txtAsyncResult.Text = t.Result;
}