await运算符只能用于标记为' async'的方法或lambda中。修改

时间:2016-03-31 10:53:13

标签: c# asynchronous

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

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/en-us/library/hh524395.aspx 我的代码应该有用,所以我不确定发生了什么,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

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某事物(在等待上)时,重要的部分是你等待的方法被标记为async。那是完全编译器错误告诉你的内容:仔细阅读:

  

await运算符只能用于标有“async”修饰符的方法或lambda

说(这似乎是你理解的):

  

只有在调用标有“async”修饰符

的方法时才能使用await运算符

一般情况下,您将等待Task(或Task<T>):这就是您在那里所做的事情。 GetUsers被标记为async的事实无关紧要:重要的是它会返回等待(同样,通常为Task:案例a Task<List<User>>)。

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

如果您不清楚MSDN,我建议您仔细阅读并理解官方 Async/Await FAQ(这不是真的官方但它来自微软,我发现它比MSDN更容易理解,我认为有时可能会有点密集 - 。