我有一个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 {}没有捕获异常?
答案 0 :(得分:2)
为什么try {} catch {}没有捕获异常?
因为它被抛入另一个线程。 Invoke
的作用是:它在另一个线程中执行代码。在发生的时间内,当前线程阻塞。鉴于这两个线程被暂时联合在一起,认为调用线程能够捕获异常并不疯狂,但它也没有抓住它。这是经验性的;我可能会收到一条评论,说我对'"为什么"这里。
以下是我如何改写:
this.Invoke((MethodInvoker)delegate {
try
{
labelNoImage.Hide();
pictureBox1.Show();
pictureBox1.Load(url);
}
catch (Exception ex)
{
pictureBox1.Hide();
labelNoImage.Show();
}
});
它也更具可读性。