c# - Result<T> - 如果结果出错,则抛出异常以触发 Polly 重试

标签 c# .net async-await polly retry-logic

我最近发现了一个名为 LanguageExt.Core 的 nuget,以及为什么在通过中间件等处理异常时抛出异常效率不高。

说到这里,我想知道简单检查结果是否有错误的最佳方法是什么,这样我就可以抛出异常来触发 Polly 的重试模式逻辑。

我能想到的最好的:

private async Task RunAsync(Uri uri)
{
    await ConnectAsync(uri);

    var result = await ConnectAsync(uri);

    if (result.IsFaulted)
    {
        // Cannot access result.Exception because it's internal
    }

    _ = result.IfFail(ex =>
    {
        _logger.LogError(ex, "Error while connecting to the endpoint");
        throw ex;
    });

    ...
private async Task<Result<Unit>> ConnectAsync(Uri uri)
{
    if (_ws is not null)
    {
        return new Result<Unit>(new InvalidOperationException("The websocket client is already connected"));
    }

    var ws = Options.ClientFactory();
    try
    {
        using var connectTimeout = new CancellationTokenSource(Options.Timeout);
        await ws.ConnectAsync(uri, connectTimeout.Token).ConfigureAwait(false);
    }
    catch
    {
        ws.Dispose();
        return new Result<Unit>(new InvalidOperationException("Failed to connect to the endpoint"));
    }

    await _connectedEvent.InvokeAsync(new ConnectedEventArgs(uri));

    _ws = ws;
    IsRunning = true;

    return Unit.Default;
}

最佳答案

根据评论,似乎是 ConnectAsync可能会失败并显示 InvalidOperationException里面 Result目的。在这种特殊情况下 ResultIsFaulted设置为true仅当 IOE被传递到Result的 Actor 。

因此,如果您想执行重试,那么您应该定义如下策略:

var retryPolicy = Policy<Result<Unit>>
    .HandleResult(r => r.IsFaulted)
    .WaitAndRetryAsync(...)

关于c# - Result<T> - 如果结果出错,则抛出异常以触发 Polly 重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74178685/

相关文章:

c# - 添加到服务提供者后能否更改Msal Authentication中的Authority、ClientId、DefaultAccessTokenScopes

javascript - js如何循环发送多个请求

.net - 新的 HttpClient 代理设置问题

c# - 在 ScrollViewer Windows Phone 8.0 中将文本换行

c# - 如何从可执行文件中确定应用程序子系统

.net - AMQP 1.0 和交易

C# 3des 加密,如何知道它何时失败?

javascript - 在这种情况下如何使用 Async/Await?

c# - 启用/禁用任务管理器

.net - 如何在 Visual Studio 生成的 MSI 中更改 .InstallState 文件的位置