我有一个问题。当我在异步方法中不使用await关键字时,按下按钮后,winform会在几秒钟内无响应,然后文本框中会填充相应的数据(然后winform会响应),但是当我使用await关键字时,按下按钮后,点击winfroms变为永远不会反应迟钝。我的错是什么?
这是并等待关键字:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = AccessTheWebAsync().Result.ToString();
}
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> GetString = client.GetStringAsync("http://msdn.microsoft.com");
string urlContents = await GetString;
return urlContents.Length;
}
这是没有等待关键字:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = AccessTheWebAsync().Result.ToString();
}
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
string urlContents = client.GetStringAsync("http://msdn.microsoft.com").Result.ToString();
return urlContents.Length;
}
答案 0 :(得分:8)
你可能陷入僵局。
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = AccessTheWebAsync().Result.ToString();
}
应该是:
private async void button1_Click(object sender, EventArgs e)
{
var length = await AccessTheWebAsync();
textBox1.Text = length.ToString();
}
如果您发现自己正在访问.Result
,那么您可能做错了。在事件处理程序中,将其标记为async void
(仅适用于Main方法或事件处理程序)并等待异步调用的结果。请特别注意Async/Await - Best Practices in Asynchronous Programming,因为异步代码很棘手。
访问.Result
可能会导致死锁,这可以解释为什么它对您没有反应。