繁体   English   中英

等待操作符只能在标有'async'修饰符的方法或lambda中使用

[英]The await operator can only be used in a method or lambda marked with the 'async' modifier

我收到此错误(标题中),这是我的代码

public async Task<int> ReadTextFile()
    {
        //
        // Read in a file line-by-line, and store it all in a List.
        //
        var watch = Stopwatch.StartNew();
        using (StreamReader reader = new StreamReader("Users.txt"))
        {
            String line;
            while ((line = await reader.ReadLineAsync()) != null)
            {
                String[] splitLines = line.Split(' ');
                User user;
                if (splitLines.Length == 3)
                {
                    user = new User
                        {
                            FirstName = splitLines[0],
                            MiddleName = splitLines[1],
                            LastName = splitLines[2]
                        };
                }

                else if (splitLines.Length == 2)
                {
                    user = new User
                    {
                        FirstName = splitLines[0],
                        LastName = splitLines[1]
                    };
                }

                else
                {
                    user = new User
                    {
                        FirstName = splitLines[0]
                    };
                }

                users.Add(user);
            }
        }
        int number = 0;
        for (int i = 0; i < 6000; i++)
        {
            for (int j = 0; j < 1000; j++)
            {
                for (int k = 0; k < 1000; k++)
                {
                    number += 1;
                } 
            }
        }
            watch.Stop();
        var elapsedMs = watch.ElapsedMilliseconds;
        return number;
    }


public async Task<List<User>> GetUsers()
    {
        await this.ReadTextFile();
        return this.users;
    }


 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MainWindowViewModel viewModel = new MainWindowViewModel();
        var x = await viewModel.GetUsers();//ERROR IS ON THIS LINE
        //dataGrid.ItemsSource = await viewModel.GetUsers();


    }
}

此处以示例为例https://msdn.microsoft.com/zh-cn/library/hh524395.aspx我的代码应该可以工作,所以我不确定发生了什么,请有人帮忙吗?

var x = await viewModel.GetUsers(); 还必须使用async方法。 您无法await未标记为async

更新 :使用更多代码进行更新后,您正在尝试await Button_Click方法中的方法。

对于您的特定情况,您需要将Button_Click标记为async 请注意,不建议使用async void (最好返回一个Task ),但这是支持async void特定情况 :允许将具有特定void签名(您不能更改)的委托标记为async 所以就:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    // ...
    var x = await viewModel.GetUsers();
    // ...
}

当您await某事(在awaitable上 )时,重要的是将您等待的方法标记为async 正是编译器错误告诉您的内容:请仔细阅读以下内容:

等待操作符只能在标有'async'修饰符的方法或lambda中使用

没有说(看来这就是您所理解的):

仅当调用标有'async'修饰符的方法时,才可以使用await运算符

通常,您将等待一个Task (或Task<T> ):那就是您在这里所做的。 GetUsers是否标记为async的事实是无关紧要的:重要的部分是它返回一个可等待的对象 (同样,通常是Task :在您的情况下为Task<List<User>> )。

该方法( GetUsers )是否需要标记为async ,仅取决于该方法本身是否使用await (在您的情况下,它确实使用),而不取决于调用方方法是否将等待其结果。

如果您至少不清楚MSDN,我建议您仔细阅读并了解官方的 Async / Await常见问题解答 (虽然它不是官方的,但它来自Microsoft,我发现它比MSDN更易于理解。我估计有时可能有点密集-)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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