Как мне обрабатывать исключения, которые генерируются во время асинхронных методов, которые я сделал синхронными? - PullRequest
0 голосов
/ 16 февраля 2010

Я пишу синхронный метод, который вызывает асинхронный метод на другом сервере. Метод сервера вызывает обратный вызов, когда это сделано, и в случае ошибки один из аргументов обратного вызова содержит исключение. Я хотел бы выбросить исключение из моего метода, за исключением исключения сервера как его 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 ]

2 голосов
/ 17 февраля 2010

Нет ничего плохого в том, чтобы возвращать в штучной упаковке исключение из внешнего процесса, особенно если у вас есть вложенные внутренние исключения или вам нужна трассировка стека. Если вас интересуют только сообщения об исключениях, вы можете просто объединить их в строку и передать только обратно.

1 голос
/ 16 февраля 2010

Вы делаете это довольно тяжело для себя, применяя лямбду по-своему.Будет намного легче, если вы напишите это в строке.Как то так:

        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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...