我收到此错误(在标题中),这是我的代码
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 我的代码应该有用,所以我不确定发生了什么,有人可以帮忙吗?
答案 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更容易理解,我认为有时可能会有点密集 - 。