我有以下方法:
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/