赫本头做法,新感觉音乐工作室,lol瑞文h
在异步转同步时,使用不当容易造成死锁(程序卡死)
看如下案例:
有一个异步方法
1 private static async task testasync() 2 { 3 debug.writeline("异步任务start……"); 4 await task.delay(2000); 5 debug.writeline("异步任务end……"); 6 }
在执行如上异步方法时,尝试将其转换为同步方法
按照官方文档《》,taskcompletionsource使用步骤:
1 private void taskcompletesourcedead_onclick(object sender, routedeventargs e) 2 { 3 awaitbytaskcompletesource(testasync()); 4 debug.writeline($"4. taskcompletesource_onclick end"); 5 } 6 private void awaitbytaskcompletesource(task task) 7 { 8 var taskcompletionsource = new taskcompletionsource<object>(); 9 var taskfromsource = taskcompletionsource.task; 10 task.continuewith(action => 11 { 12 taskcompletionsource.setresult(true); 13 }); 14 var task1result = taskfromsource.result; 15 debug.writeline($"3. awaitbytaskcompletesource end:{task1result}"); 16 }
但是,以上逻辑执行时,界面会卡死!卡死效果如下,卡死的时候点击界面其它按钮无任何反应。
为何会死锁?
猜测可能与task.wait()类似的死锁,详细如下:
关键字:死锁、taskcompletionsource
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论