2017-01-03 55 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上面寫,或者如果你提到忘了多行的一部分。我希望這篇文章對你有所幫助,儘管你的問題已經得到解答。

相關問題