2016-08-30 45 views
0

我有一個Windows圖形用戶界面異步窗體應用程序,我想asynchrnoously更新控制,其中 - 當然 - 使我這樣一個問題:How to update the GUI from another thread in C#?更新的WinForms與匿名方法

多少谷歌搜索和煩惱的理解後如何實現#1的答案,我反而轉向第二個答案:https://stackoverflow.com/a/661662/2246411

我現在的代碼如下所示:

private void showPicture(string name) 
{ 
    if (name == "") 
    { 
     if (!this.Created || (isNullOrEmpty(comboBoxRepresentative) && isNullOrEmpty(comboBoxState))) 
      return; 
     else 
     { 
      this.Invoke((MethodInvoker)delegate { pictureBox1.Hide(); }); 
      this.Invoke((MethodInvoker)delegate { labelNoImage.Show(); }); 
     } 
    } 

    string url = "http://info.sigmatek.net/downloads/SalesMap/" + name; 

    try 
    { 
     this.Invoke((MethodInvoker)delegate { labelNoImage.Hide(); }); 
     this.Invoke((MethodInvoker)delegate { pictureBox1.Show(); }); 
     this.Invoke((MethodInvoker)delegate { pictureBox1.Load(url); }); 
    } 
    catch 
    { 
     this.Invoke((MethodInvoker)delegate { pictureBox1.Hide(); }); 
     this.Invoke((MethodInvoker)delegate { labelNoImage.Show(); }); 
    } 
} 

this.Invoke((MethodInvoker)delegate { pictureBox1.Load(url); });拋出參數異常(Parameter is not valid)該捕獲塊沒有捕獲。爲什麼try {} catch {}不會捕獲異常?

回答

2

爲什麼試一試{} catch {}沒有發現異常?

因爲它被引發到另一個線程中。這就是Invoke所做的:它在另一個線程中執行代碼。在發生的這段時間內,當前線程阻塞。考慮到這兩個線程暫時被如此綁定在一起,認爲調用線程能夠捕獲異常並不瘋狂,但它也無法抓住它。這是經驗的;我可能會收到一條評論,說我對這裏的「爲什麼」錯了。

以下是我想重寫:

this.Invoke((MethodInvoker)delegate { 
    try 
    { 
     labelNoImage.Hide(); 
     pictureBox1.Show(); 
     pictureBox1.Load(url); 
    } 
    catch (Exception ex) 
    { 
     pictureBox1.Hide(); 
     labelNoImage.Show(); 
    } 
}); 

這是更具可讀性,太。

+0

啊,這很有道理!而且,你是對的,這樣更具可讀性。謝謝! – derekantrican

+0

而且效率更高。 'Invoke'具有相對較高的開銷,因爲它會導致線程切換... – Phil1970