C# 使用匿名方法异步更新WinForms GUI
我有一个Windows窗体应用程序,我正在尝试异步更新控件,这当然让我想到了这个问题: 在谷歌搜索了很多次,并且很难理解如何实现#1答案后,我转而使用第二个答案: 我的代码现在如下所示:C# 使用匿名方法异步更新WinForms GUI,c#,winforms,C#,Winforms,我有一个Windows窗体应用程序,我正在尝试异步更新控件,这当然让我想到了这个问题: 在谷歌搜索了很多次,并且很难理解如何实现#1答案后,我转而使用第二个答案: 我的代码现在如下所示: private void showPicture(string name) { if (name == "") { if (!this.Created || (isNullOrEmpty(comboBoxRepresentative) && isNullOrEmp
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)委托{pictureBox1.Load(url);})代码>正在引发catch块未捕获的参数异常(参数无效
)。为什么try{}catch{}不能捕获异常
为什么try{}catch{}不能捕获异常
因为它正在另一个线程中抛出。这就是Invoke
所做的:它在另一个线程中执行代码。在此期间,当前线程阻塞。鉴于这两个线程是临时绑定在一起的,认为调用线程能够捕获异常并不疯狂,但对我来说它也不能捕获异常。这是经验性的;我可能会收到一条评论,说我对这里的“为什么”完全错了
下面是我如何重写的:
this.Invoke((MethodInvoker)delegate {
try
{
labelNoImage.Hide();
pictureBox1.Show();
pictureBox1.Load(url);
}
catch (Exception ex)
{
pictureBox1.Hide();
labelNoImage.Show();
}
});
它也更具可读性
为什么try{}catch{}不能捕获异常
因为它正在另一个线程中抛出。这就是Invoke
所做的:它在另一个线程中执行代码。在此期间,当前线程阻塞。鉴于这两个线程是临时绑定在一起的,认为调用线程能够捕获异常并不疯狂,但对我来说它也不能捕获异常。这是经验性的;我可能会收到一条评论,说我对这里的“为什么”完全错了
下面是我如何重写的:
this.Invoke((MethodInvoker)delegate {
try
{
labelNoImage.Hide();
pictureBox1.Show();
pictureBox1.Load(url);
}
catch (Exception ex)
{
pictureBox1.Hide();
labelNoImage.Show();
}
});
它也更具可读性 啊,这是有道理的!而且,你是对的,这更具可读性。谢谢而且效率更高<代码>调用
的开销相对较高,因为它会导致线程切换……啊,这很有道理!而且,你是对的,这更具可读性。谢谢而且效率更高<代码>调用开销相对较高,因为它会导致线程切换。。。