使用递归异步/等待

时间:2015-05-13 07:00:48

标签: c#

请考虑以下代码:

void TopLevelCaller() {
    RecursiveAwaiter();
}

async Task RecursiveAwaiter() {
    var result = await ReceiveDataAsync();
    FireEvent(result);
    RecursiveAwaiter();
}

假设ReceiveDataAsync因异常而失败。 是否可以修改代码以在TopLevelCaller()中捕获此异常,以便可以在TopLevelCaller()存在的类中完成所有错误处理?

让实施者像这样处理错误会更好:

void TopLevelCaller() {
    try {
        RecursiveAwaiter();
    } catch (Exception e)
    {
        // Something went wrong. Handle appropriately.
    }
}

而不是像:

async Task RecursiveAwaiter() {
    try {
        var result = await ReceiveDataAsync();
        FireEvent(result);
        RecursiveAwaiter();
    } catch (Exception e) {
        FireExceptionEvent(e);
    }
}

1 个答案:

答案 0 :(得分:1)

async void TopLevelCaller()

async void几乎总是坏主意。它专为WPF控制事件而设计。这是火灾和遗忘功能,因此您无法捕获TopLevelCaller抛出的异常。它应该工作:

async Task TopLevelCaller() {
    try {
        await RecursiveAwaiter();
    } catch (Exception e)
    {
        // Something went wrong. Handle appropriately.
    }
}