c# - 在 C# 中,如何使用 `TryAsync` 的实例?

我有以下方法:

private async Task<(bool, string)> Relay(
        WorkflowTask workflowTask,
        MontageUploadConfig montageData,
        File sourceFile,
        CancellationToken cancellationToken
    )
{
    try
    {
        byte[] fileContent = await _httpClient.GetByteArrayAsync(sourceFile.Url, cancellationToken);
        await _attachmentController.TryUploadAttachment(montageData.EventId, fileContent, sourceFile.Name);
        return (true, null);
    }
    catch (Exception exception)
    {
        _logger.LogError(exception, $"File cannot be uploaded: {sourceFile.Name}", workflowTask);
        return (false, exception.ToString());
    }
}

我想重构它以使用 LanguageExt.Core 中的 TryAsync(或其他一些功能性 Try 类型)。

我已经设法将上述方法重构为:

private TryAsync<bool> Relay(
    MontageUploadConfig montageData,
    File sourceFile,
    CancellationToken cancellationToken
) => new(async () =>
{
    byte[] fileContent = await _httpClient.GetByteArrayAsync(sourceFile.Url, cancellationToken);
    return await _attachmentController.TryUploadAttachment(montageData.EventId, fileContent, sourceFile.Name);
});

这可以编译,但我无法使用结果,无论是执行接下来的操作还是记录异常。

我如何检查结果并对返回值或任何异常做些什么?

最佳答案

declaration的 TryAsync是:

public delegate Task<Result<A>> TryAsync<A>();

所以你可以这样做:

var result = await Relay(...)()

并得到一个 Result<bool> .有很多方法可以消费 Result .例如

result.IfFail(exception => { ... });
result.IfSucc(result => { ... });

关于c# - 在 C# 中,如何使用 `TryAsync` 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69350132/

相关文章:

sql - 按可互换使用的值对分组

c - 尝试将二维字符串数组传递给函数并打印它

reactjs - 如何去除 Material-UI 对话框中的阴影?

c - 打印 int_fast_32_t 等数据类型的可移植和正确方法是什么

reactjs - 如何实现react-dnd useDragLayer?

ios - 更改 iOS 15 中导航栏的当前颜色

android - 如何从 Webview 中访问摄像头?

python - 如何旋转图像以获得非空像素?

loops - 如何在 Kotlin 循环内更改 for 循环的计数器变量值?

javascript - Cypress 最佳实践 - 存储和比较两个值