在bool TryXXX(out T result) BCL中有许多常见的bool TryXXX(out T result)方法,其中最流行的可能是int.TryParse(...)。
我想实现一个异步 TryXXX()方法。显然,我不能使用out参数。
这方面有既定的模式吗?
更重要的是,我需要下载和解析一个文件。该文件可能不存在。
到目前为止,这就是我想出来的:
public async Task<DownloadResult> TryDownloadAndParse(string fileUri)
{
try
{
result = await DownloadAndParse(fileUri); //defined elsewhere
return new DownloadResult {IsFound = true, Value = result}
}
catch (DownloadNotFoundException ex)
{
return new DownloadResult {IsFound = false, Value = null}
}
//let any other exception pass
}
public struct DownloadResult
{
public bool IsFound { get; set; }
public ParsedFile Value { get; set; }
}发布于 2017-04-20 10:09:07
可能的决策之一是包含0或1元素的ParsedFile数组。
public async Task<ParsedFile[]> TryDownloadAndParse(string fileUri)
{
try
{
return new[] { await DownloadAndParse(fileUri) };
}
catch (DownloadNotFoundException ex)
{
return new ParsedFile[0];
}
}现在您可以检查结果:
. . .
var parsedFiles = await TryDownloadAndParse(url);
if (parsedFiles.Any())
{
var parsedFile = parsedFiles.Single();
// more processing
}
. . .如果要调用void方法,可以使用?.运算符:
var parsedFiles = await TryDownloadAndParse(url);
parsedFiles.SingleOrDefault()?.DoVeryImportantWorkWithoutResult();更新
在Azure中,您可以使用班级。
https://stackoverflow.com/questions/37810660
复制相似问题