我正在阅读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();
});
}
}
RichTextBox显示字符串很好,如果这很有用。 –
删除'Task.Run'它是无用 – Fabio
MaxLength = 0,你期望什么 – CSharpie