1

下面的代码似乎应该吞下 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;
}
4

2 回答 2

2

您无法捕获另一个线程的异常,至少不能以这种方式捕获。在新打开的线程中捕获你的异常,你会没事的。

于 2013-08-22T21:21:02.860 回答
0

在 .NET 4 及更高版本中,AccessViolationException默认情况下会绕过 catch 块。可以在 web.config 中启用对此类异常的捕获,但不应启用,因为它们通常是由非托管代码中的错误引起的,并表明应用程序状态已损坏。

于 2013-09-03T13:11:40.837 回答