2016-08-30 23 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