Ric*_*o W -1 c# wpf asynchronous mvvm async-await
我开始使用async/await了.我使用基于MVVM模式的WPF编写了简单的应用程序,但它没有像我预期的那样工作.该程序的工作原理是没有异步函数:执行执行函数后,只有在循环函数结束后才会冻结和解冻.
请告诉我哪个部分出错了.我很感激任何反馈.:)
这是我的modelview类.它继承自wpf类,它包含标准wpf函数的定义,如OnPropertyChanged.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
i3a*_*non 10
代码中没有异步部分.简单地使用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;
}
Run Code Online (Sandbox Code Playgroud)
如果您实际上有异步操作,则可以使用它:
async void _work(object parameter)
{
status = "Working...";
await Task.Delay(1000);
status = "Done: " + j;
}
Run Code Online (Sandbox Code Playgroud)
指南:如果您的"异步"方法没有await
内部,则它不是异步的.
你没有做任何异步.该async
关键字并不意味着"创造另一个线程"; 它非常复杂,但基本上它允许代码在另一个异步操作完成时使用continuation .好的例子包括异步数据库访问,文件访问,网络访问等.它还可以包括通过线程和的异步长时间运行操作Task.Run
.但是:你不是那样做的.没有什么不完整await
- 代码只在主线程上运行.它只会在有不完整的东西继续进行时安排继续.
引用编译器(谈论loop
方法):
警告此异步方法缺少'await'运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.
归档时间: |
|
查看次数: |
849 次 |
最近记录: |