【发布时间】:2021-11-19 19:28:01
【问题描述】:
我有以下方法:
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);
});
这可以编译,但我不知道如何使用结果,要么做接下来的任何事情,要么记录异常。
如何检查结果并对返回值或任何异常进行处理?
【问题讨论】:
-
为什么要“使用 TryAsync”?我的意思是,如果您不知道它的用途,那么为什么首先要使用它?
-
鉴于
TryAsync本身返回一个Task...为什么?无论您的意思是什么,这都不会使您的代码更具“功能性”。使用 Result 类要有趣得多。在这种情况下,您应该询问如何创建和使用Result类。在 C# 7 及更高版本中,您将使用模式匹配 -
@Evk,我知道它的用途,我只是不知道如何在 C# 中使用它。
-
@PanagiotisKanavos,您能演示一下吗?谢谢。
标签: c# language-ext