我应该如何处理在我已经同步的异步方法期间抛出的异常?

时间:2010-02-16 16:59:06

标签: c# .net multithreading exception

我正在编写一个在另一台服务器上调用异步方法的同步方法。服务器的方法在完成后调用回调,并且在出错的情况下,其中一个回调的参数包含异常。我想从我的方法抛出一个异常,服务器的异常作为InnerException。但是,为了捕获异常,我必须将其打包,似乎应该有一个更简单的方法。我应该更简单地做些什么?

我的代码是这样的:

private class BoxedException
{
    public Exception Exception;
}

public bool MyMethod()
{
    EventWaitHandle waitHandle = new new EventWaitHandle(false, EventResetMode.ManualReset);
    BoxedException boxedException = new BoxedException();

    bool called = theServer.ServerMethod(getCallback(waitHandle, boxedException));
    if (called)
    {
        waitHandle.WaitOne();

        if (boxedException.Exception != null)
            throw new Exception("ServerMethod failed", boxedException.Exception);
    }
}

private ServerCallback getCallback(EventWaitHandle waitHandle, BoxedException be)
{
    return (object sender, ServerArgs e) =>
    {
        handleServerArgs(e, be);
        waitHandle.Set();
    };
}

private void handleServerArgs(ServerArgs e, BoxedException be)
{
    if (e.Exception != null)
    {
        be.Exception = e.Exception;
    }
    else
    {
        // do stuff...
    }
}

2 个答案:

答案 0 :(得分:2)

从外部进程传回一个盒装异常没有任何本质上的错误,特别是如果你有嵌套的内部异常或需要堆栈跟踪。如果您只对异常消息感兴趣,那么您可以通过将它们连接成一个字符串并仅将其传递回去。

答案 1 :(得分:1)

通过将lambda放在自己的方法中,你对自己有点困难。如果你内联写它会变得容易多了。像这样:

        var waitHandle = new ManualResetEvent(false);
        Exception fault = null;
        bool called = theServer.ServerMethod((obj, se) => {
            if (se.Exception != null) fault = se.Exception;
            else ProcessServerResponse(se);
            waitHandle.Set();
        });
        if (called) {
            waitHandle.WaitOne();
            if (fault != null) kaboom(fault);
        }