繁体   English   中英

等待/异步无法按预期工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM