[英]Await/async doesn't work as expected
我开始使用异步/等待。 我已经使用基于 MVVM 模式的 WPF 编写了简单的应用程序,但它没有按我预期的那样工作。 该程序的工作原理是没有异步函数:执行执行函数后,它只会在循环函数结束后冻结和解冻。
请告诉我我做错了什么部分。 我很感激任何反馈。 :)
这是我的模型视图类。 它继承自 wpf 类,该类包含 OnPropertyChanged 等标准 wpf 函数的定义。
public class ModelView : wpf
{
string _state;
public string state { get { return _state; } set { _state = value; OnPropertyChanged("state"); } }
public DelegateCommand work { get; set; }
public ModelView()
{
state = "Program started";
work=new DelegateCommand(_work);
}
async void _work(object parameter)
{
state = "Working...";
int j=await loop();
state = "Done: " + j;
}
async Task<int> loop()
{
int i;
for(i=0;i<1000000000;i++);
return i;
}
}
您的代码中没有异步部分。 简单地使用async
关键字并不能做到这一点。 如果您希望将同步代码卸载到不同的线程,请改用Task.Run
:
async void _work(object parameter)
{
status = "Working...";
int j=await Task.Run(() => loop());
status = "Done: " + j;
}
int loop()
{
int i;
for(i=0;i<1000000000;i++);
return i;
}
如果您确实有异步操作,则可以改用它:
async void _work(object parameter)
{
status = "Working...";
await Task.Delay(1000);
status = "Done: " + j;
}
指南:如果您的“异步”方法内部没有await
,则它不是异步的。
你没有做任何异步的事情。 async
关键字并不意味着“创建另一个线程”; 它相当复杂,但基本上它允许代码在另一个异步操作完成时使用延续。 好的例子包括异步数据库访问、文件访问、网络访问等。它还可以包括通过线程和Task.Run
异步长时间运行的操作。 但是:你没有那样做。 没有不完整的await
——代码只是在主线程上运行。 它仅在有不完整的内容要继续时才安排延续。
引用编译器(谈论loop
方法):
警告此异步方法缺少“等待”运算符,将同步运行。 考虑使用 'await' 运算符来等待非阻塞 API 调用,或使用 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。
看起来问题出在您的loop
函数上。 即使您已将其声明为async
但其中没有await
语句,并且您应该收到编译器警告,正如@Marc Gravell 指出的那样。
该函数通过大量循环迭代占用 UI 线程,这将导致阻塞,然后返回最终值。
所以你的循环函数实际上是一个同步函数。 假设您这样做是为了测试目的,模拟async
操作的一个好方法是使用Task.Delay
。
例如:
async Task<int> loop()
{
await Task.Delay(5000);
return 1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.