使用匿名方法更新WinForms GUI异步

时间:2016-08-30 18:44:16

标签: c# winforms

我有一个Windows窗体应用程序,并且我试图异步更新控件,当然 - 这让我想到了这个问题:How to update the GUI from another thread in C#?

经过大量谷歌搜索并且无法理解如何实现#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); });正在抛出catch块未捕获的Argument Exception(Parameter is not valid)。为什么try {} catch {}没有捕获异常?

1 个答案:

答案 0 :(得分:2)

  

为什么try {} catch {}没有捕获异常?

因为它被抛入另一个线程。 Invoke的作用是:它在另一个线程中执行代码。在发生的时间内,当前线程阻塞。鉴于这两个线程被暂时联合在一起,认为调用线程能够捕获异常并不疯狂,但它也没有抓住它。这是经验性的;我可能会收到一条评论,说我对'"为什么"这里。

以下是我如何改写:

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

它也更具可读性。