首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步TryParse(…)模式

异步TryParse(…)模式
EN

Stack Overflow用户
提问于 2016-06-14 11:25:51
回答 1查看 2.2K关注 0票数 15

bool TryXXX(out T result) BCL中有许多常见的bool TryXXX(out T result)方法,其中最流行的可能是int.TryParse(...)

我想实现一个异步 TryXXX()方法。显然,我不能使用out参数。

这方面有既定的模式吗?

更重要的是,我需要下载和解析一个文件。该文件可能不存在。

到目前为止,这就是我想出来的:

代码语言:javascript
复制
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; }
}
EN

回答 1

Stack Overflow用户

发布于 2017-04-20 10:09:07

可能的决策之一是包含0或1元素的ParsedFile数组。

代码语言:javascript
复制
public async Task<ParsedFile[]> TryDownloadAndParse(string fileUri)
{
    try
    {
        return new[] { await DownloadAndParse(fileUri) };
    }
    catch (DownloadNotFoundException ex)
    {
        return new ParsedFile[0];
    }
}

现在您可以检查结果:

代码语言:javascript
复制
. . .

var parsedFiles = await TryDownloadAndParse(url);
if (parsedFiles.Any())
{
    var parsedFile = parsedFiles.Single();
    // more processing
}

. . .

如果要调用void方法,可以使用?.运算符:

代码语言:javascript
复制
var parsedFiles = await TryDownloadAndParse(url);
parsedFiles.SingleOrDefault()?.DoVeryImportantWorkWithoutResult();

更新

在Azure中,您可以使用班级

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37810660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档