当前位置: 首页 > 编程语言 > C#

Await-async没有按预期工作分享

时间:2023-04-10 22:28:00 C#

Await/async没有按预期工作我开始使用async/await。我使用基于MVVM模式的WPF编写了简单的应用程序,但它没有像我预期的那样工作。该程序在没有异步函数的情况下工作:执行函数执行后,只有在循环函数结束后才会冻结和解冻。请告诉我哪一部分我错了。我感谢任何反馈。?这是我的模型视图类。它继承自wpf类,该类包含标准wpf函数的定义,如OnPropertyChanged。公共类ModelView:wpf{string_state;publicstringstate{get{return_state;}设置{_state=值;OnPropertyChanged("状态");}}publicDelegateCommandwork{get;放;}publicModelView(){state="程序启动";work=newDelegateCommand(_work);}asyncvoid_work(objectparameter){state="Working...";intj=等待循环();state="完成:"+j;}asyncTaskloop(){inti;对于(i=0;i<1000000000;i++);返回我;代码中没有异步部分。简单地使用async关键字并非如此。如果您希望将同步代码卸载到其他线程,请使用Task.Run:asyncvoid_work(objectparameter){status="Working...";intj=awaitTask.Run(()=>loop());status="完成:"+j;}intloop(){inti;对于(i=0;i<1000000000;i++);返回我;如果你真的有异步操作,你可以使用这个:asyncvoid_work(objectparameter){status="Working...";等待任务。延迟(1000);status="完成:"+j;指南:如果您的“异步”方法中没有等待,则它不是异步的。您没有异步执行任何操作。async关键字并不意味着“创建另一个线程”;它非常复杂,但基本上它允许代码在另一个异步操作完成时使用延续。很好的例子包括异步数据库访问、文件访问、网络访问等。它还可以包括通过线程和Task.Run进行的异步长时间运行操作。但是:你不那样做。await没有什么不完整的——代码只在主线程上运行。它只会安排继续,如果有一些不完整的继续。引用编译器(谈论循环方法):警告此异步方法缺少“await”运算符并将同步运行。考虑使用“await”运算符等待非阻塞API调用,或“awaitTask.Run(...)”在后台线程上执行CPU绑定工作。看起来问题出在你的循环函数上。即使您已将其声明为async但其中没有await语句,您也应该收到编译器警告,正如@MarcGravell指出的那样。在返回最终值之前,该函数会经历大量循环迭代,占用阻塞的UI线程。所以你的循环函数实际上是一个同步函数。假设您这样做是出于测试目的,模拟异步操作的一个好方法是使用Task.Delay。例如:以上就是C#学习教程的全部内容:Await/async不能按预期工作。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——asyncTaskloop(){awaitTask.延迟(5000);返回1;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: