C# 异步函数测

76 篇文章 1 订阅

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysh05

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值