2017-01-03 54 views
0

我正在阅读Jeffrey Richter的一本书,CLR通过C#第4版。在本书中,作者讨论了异步编程,并指出了GUI应用程序中的一个问题,例如WinForms或WPF应用程序,其中同步调用异步方法会导致GUI线程被阻塞。为什么WinForms应用程序中的此文本框会中断?

我在Visual Studio 2015中创建了一个开箱即用的WinForms应用程序,并键入了本书中讨论的方法。该代码获取一个任务,表单然后使用Result属性来设置窗体上的文本框。我在下面的表格中包含了部分类定义。

问题是执行此操作后文本框变得破碎。破碎我的意思是不可能输入到文本框。此外,在设置TextBox的Text属性之后,TextBox实际上并不显示文本。我不认为问题在于Richter书中的代码。毕竟在调试器中运行应用程序后,我实际上可以看到所请求的页面的html为字符串。

为什么TextBox会中断?

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     textBox1.MaxLength = 0; 
     string page = GetHttp().Result; 
     textBox1.Text = page; 


    }   

    private Task<String> GetHttp() 
    { 

     return Task.Run(async() => 
     { 
      // Issue the HTTP request and let the thread return from GetHttp 
      HttpResponseMessage msg = await new HttpClient().GetAsync("http://www.techspot.com"); 
      return await msg.Content.ReadAsStringAsync(); 
     }); 

    } 
} 
+0

RichTextBox显示字符串很好,如果这很有用。 –

+0

删除'Task.Run'它是无用 – Fabio

+0

MaxLength = 0,你期望什么 – CSharpie

回答

0

答案是文本框是单行文本框。使文本框成为多行文本框(我省略了,巴掌的额头)导致代码正常工作。

0

不要设置文本框的MaxLength财产。

+0

虽然没有任何区别。我认为这个问题可能是由于返回的字符串长度所致,因为它按照https://msdn.microsoft.com/en-us/library/system.windows.forms超过了WinForms文本框的32,767限制。 textboxbase.maxlength(v = vs.110)的.aspx –

-1

澄清你的代码不会运行异步。您不要在这里以正确的方式实现异步/等待模式。如果使用GetHttp().Result;,则可能会变成死锁,因为.Result块会等待您的任务完成。相反,您应该使用await来确保您的任务已完成。进一步等待不会阻止你的用户界面,不会造成死锁。我准备您的代码,并使用正确的名称约定:

private async void button1_Click(object sender, EventArgs e) 
{ 
    //Notice that .Result or .Wait on Gui-Thread can cause a Deadlock!!! 
    string page = await GetHttpAsync(); 
    textBox1.Text = page; 
}   

private async Task<String> GetHttpAsync() 
{ 
    //Make sure you don't need any Task here. The await makes this async 
    HttpResponseMessage msg = await new HttpClient().GetAsync("http://www.techspot.com"); 
    return await msg.Content.ReadAsStringAsync(); 
} 

那你的文本框坏是事实,如果你设置MaxLength = 0喜欢@Joel Coehoorn上面写,或者如果你提到忘了多行的一部分。我希望这篇文章对你有所帮助,尽管你的问题已经得到解答。

相关问题