动机
我Task
在一个Windows.Forms
应用程序中使用 a ,我想处理Task
由 using引发的任何异常,Task.ContinueWith()
并Control.Invoke()
在主 UI 线程上重新引发任何异常。
但是,如果我使用,我无法注意到异常Control.Invoke()
- 但如果我使用Control.BeginInvoke()
.
有谁知道为什么它不工作Control.Invoke()
,以及如何让它工作?
解决方法
我目前使用Control.BeginInvoke()
的是 throw 而不是使用Control.Invoke()
重现步骤
环境:Windows 7 x64,Visual Studio 2012,为 .Net 4 编译(但 .Net 4.5 作为 VS2012 的一部分安装)。
(1) 使用名为form1
.
(2) 在名为 的表单上放置一个按钮button1
,并为其添加一个名为 的处理程序button1_Click()
。
(3) 执行button1_Click()
如下:
private void button1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
this.BeginInvoke(new Action(() =>
{
throw new InvalidOperationException("TEST");
}));
});
}
(4) 运行程序并单击按钮。一秒钟后,将显示一个异常对话框,如您所料。
(5) 现在this.BeginInvoke
改为this.Invoke
。
(6) 再次运行程序并单击按钮。现在异常被默默地忽略了!
两者都在指定的 UI 线程上执行Invoke()
,所以我不明白为什么在一种情况下会忽略异常,而在另一种情况下不会忽略异常...BeginInvoke()
Control
我猜这一定与Control.Invoke()
如果它抛出异常就永远不会返回的事实有关,但是我的大脑很痛苦,试图弄清楚为什么这意味着异常(显然)被完全忽略了。