【发布时间】:2010-08-20 13:51:50
【问题描述】:
这个问题已经被提过很多次了,但是我想再问一遍,因为我在这里读到了一些对我来说似乎不正确的东西(可能是因为其中一个与 .NET CF 有关) ,并且我要求验证我认为合理的特定方法,并希望您提供任何反馈。
无论如何,情况和其他人一样——我想处理源自线程的错误。目前,我的代码运行良好,因为我从线程中抛出异常,但我使用的是 Invoke,而不是 BeginInvoke。
此时您可能想知道,“他为什么要创建一个线程然后调用 Invoke?为什么不直接调用一个函数?”。问题是我想通过一个参数为调用者提供灵活性,该参数指示操作应该是同步的还是异步的。
作为测试,我在异步操作模式下对其进行了测试,正如预期的那样,它静默失败,应用程序在工作线程抛出异常时在调试器中死掉。
为了确保我对线程中的异常行为以及disprove the statement in this question on SO(至少就 .NET 3.5 而言)有基本的了解,我在 WPF 应用程序中编写了一些测试代码:
代码已删除
因此,在主线程中处理源自另一个线程的事件似乎应该没有问题。
如果您同意我上面的测试,我的问题很简单——编写我的方法是否可以接受,该方法同时提供同步和异步行为,其中所有业务逻辑都包含在 try/catch 块中?内部错误被困在线程内部,如果是同步调用,则抛出异常,如果是异步调用,则引发事件?在我上面的示例代码中,我也在引发事件后抛出了异常。我不确定这是否或为什么会给我带来任何问题。
Pseudo-pseudocode:
TestFunc(async);
private TestFunc(bool async)
{
try {
throw new MyAppException("error occurred.");
} catch(MyAppException ex) {
async ? RaiseErrorEvent : throw;
}
}
更新
好的,正如汉斯所说,无论我从线程中抛出异常,它都会导致问题 - 句号。我能够测试这个案例,果然,异常被抛出,如果你按下 F5,它只会被一遍又一遍地抛出,并且永远不会终止线程。我不理解这种特殊行为——它只是通过调试器运行时的工作方式吗?我想这意味着我必须检查该方法是被称为同步还是异步。如果同步,则抛出错误。如果是异步的,则引发事件。
也许更好的方法是强制客户端始终处理事件错误,而不是捕获异常?有人对这种方法有想法吗?
【问题讨论】:
标签: c# multithreading events exception exception-handling