Winform变得反应迟钝,异步编程,C#

LOG*_*LOG 1 c# asynchronous async-await

我有一个问题.当我在异步方法中不使用await关键字时,按下按钮后,winform会在几秒钟内无响应,然后文本框中会填充相应的数据(然后winform会响应),但是当我使用await关键字时,按下按钮后,点击winfroms变为永远不会反应迟钝.我的错是什么?

这是使用await关键字:

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;
}
Run Code Online (Sandbox Code Playgroud)

没有await关键字:

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;
}
Run Code Online (Sandbox Code Playgroud)

mas*_*son 8

你可能有一个僵局.

private void button1_Click(object sender, EventArgs e)
{
        textBox1.Text = AccessTheWebAsync().Result.ToString();
}
Run Code Online (Sandbox Code Playgroud)

应该:

private async void button1_Click(object sender, EventArgs e)
{
    var length = await AccessTheWebAsync();
    textBox1.Text = length.ToString();
}
Run Code Online (Sandbox Code Playgroud)

如果你发现自己.Result正在访问,那么你可能做错了.在事件处理程序中,将其标记为async void(仅适用于Main方法或事件处理程序)并等待异步调用的结果.请特别注意Async/Await - 异步编程中的最佳实践,因为异步代码很棘手.

访问.Result可能会导致死锁,这可以解释为什么它对您没有反应.