Await/async无法按预期工作

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内部,则它不是异步的.


Mar*_*ell 5

你没有做任何异步.该async关键字并不意味着"创造另一个线程"; 它非常复杂,但基本上它允许代码另一个异步操作完成使用continuation .好的例子包括异步数据库访问,文件访问,网络访问等.它还可以包括通过线程和的异步长时间运行操作Task.Run.但是:你不是那样做的.没有什么不完整await- 代码只在主线程上运行.它只会在有不完整的东西继续进行安排继续.

引用编译器(谈论loop方法):

警告此异步方法缺少'await'运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.