![](/img/trans.png)
[英]The 'await' operator can only be used within an async lambda expression. Consider marking this lambda expression with the 'async' modifier
[英]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.