异步锁死
异步函数testAsync
private async Task<string> testAsync()
{
await Task.Delay(3000);
return DateTime.Now.ToString();
}
//以下程序调用会锁死,应该是子函数中的Delay和主函数中的this.Text = t.Result;互相锁住了
private void button1_Click(object sender, EventArgs e)
{
Task<string> t = this.testAsync();
this.textBox1.Text = DateTime.Now.ToString();
this.Text = t.Result;
this.textBox2.Text = DateTime.Now.ToString();
}
//以下程序可以正常执行
private async void button3_Click(object sender, EventArgs e)
{
this.Text = await this.testAsync();
this.textBox1.Text = DateTime.Now.ToString();
}
//以下程序可以正常执行,就是说调用异步函数时,主函数必须也要await
private void button2_Click(object sender, EventArgs e)
{
Task t= test2();
}
private async Task test2()
{
Task<string> t = this.testAsync();
this.textBox1.Text = DateTime.Now.ToString();
this.Text = await t;
this.textBox2.Text = DateTime.Now.ToString();
}
参考:
c# async/await异步编程死锁的问题 - F风 - 博客园 (cnblogs.com)
c#Async,await编程核心基础,执行顺序,死锁,使用注意点,_漫游者码农的博客-CSDN博客
总结:
尽量不要用this.Text = t.Result;得到异步结果,要用await t得到结果。
上面死锁的原因是当Task.Delay完成后需切回调用线程执行Task.Delay下面的代码,但原线程却在this.Text = t.Result;处阻塞了,所以就死锁了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2021-06-09 微信消息推送
2009-06-09 底层调用一定比上层快吗?
2009-06-09 Ramdisk磁盘速度有多快?