c# - Winform变得不响应,异步编程,C#

标签 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;
}


这没有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;
}

最佳答案

您可能陷入僵局。

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可能会导致死锁,这将解释为什么它对您无响应。

关于c# - Winform变得不响应,异步编程,C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49942198/

相关文章:

c# - 输入特定字符的文本框问题

javascript - 为什么 Promise 在 Reject 时也会返回 Resolve

c# - Web API 异步,我做对了吗?

c# - 如何验证某些回​​调被异步调用(按顺序)

.net - .NET 中套接字的 Begin* 和 *Async 之间是否存在性能差异?

javascript - 我的代码是使用异步等待的最佳方式吗?

c# - 在 UI 线程上调用异步方法

c# - 如何在 C# 中计算 "median of five"?

c# - 如何从用于登录 C# 的字符串中删除不安全字符

c# - .NET/CSS Foreach 复选框独立样式