以下代码似乎应该吞下try块中的任何类型的异常,但IIS工作进程会因为未处理的异常(标记为注释)而定期死亡并重新启动。
try
{
while (true)
{
DispatcherTask task = null;
lock (sync)
{
task = this.getTask();
if (task == null)
{
Monitor.Wait(sync);
continue;
}
}
lock (task)
{
task.Result = task.Task.DynamicInvoke(task.Params);
// ^ Delegate.DynamicInvoke(object[]) throws a TargetInvocationException
Monitor.PulseAll(task);
}
}
}
catch (Exception e)
{
}
更新
DispatcherTask
的定义:
private class DispatcherTask
{
public Delegate Task;
public object[] Params;
public object Result;
}
答案 0 :(得分:2)
你不能抓住另一个线程的例外,至少不是这样。在新打开的帖子中捕获你的异常,你会没事的。
答案 1 :(得分:0)
在.NET 4及更高版本中,AccessViolationException
默认会绕过catch块。可以在web.config中启用捕获此类异常,但不应该这样,因为它们通常是由非托管代码中的错误引起的,并且表明应用程序状态已损坏。