【问题标题】:What is the correct way to handle a null response from an asynchronous function?处理来自异步函数的空响应的正确方法是什么?
【发布时间】:2018-08-23 05:30:20
【问题描述】:

我正在开发一个与我的表通信并更新表中数据的 Azure 函数。最近发现Microsoft.WindowsAzure.Storage这个包现在只有Async函数了,对这些不太熟悉。

在我用于测试的函数中,如果行存在,我想返回 true,如果不存在,则返回 false。如果该行存在,它会工作,但如果该行不存在,程序会挂起(因为它正在等待响应)。

谁能帮帮我?

这是我的代码:

public static bool rowExists(CloudTable table, string city, string state)
{
    TableOperation tOP = TableOperation.Retrieve<SickCity>(city, state);
    Task<TableResult> result = table.ExecuteAsync(tOP);
    if (result == null)
        return false;
    else
        return true;
}

编辑:

这是我调用 rowExists 的地方

log.Info($"Does the row \"New York, NY\" exist? {rowExists(sickTable, "New York", "NY")}");

【问题讨论】:

    标签: c# azure asynchronous azure-functions azure-table-storage


    【解决方案1】:

    您没有得到预期的结果,因为您的代码没有等待异步请求完成。你需要稍微改变你的函数才能正确调用ExecuteAsync

    public static async Task<bool> rowExists(CloudTable table, string city, string state)
    {
        TableOperation tOP = TableOperation.Retrieve<SickCity>(city, state);
        var result = await table.ExecuteAsync(tOP);
    
        if (result == null)
            return false;
        else
            return true;
    }
    

    ExecuteAsync 返回一个Task,直到将来某个时间(异步操作完成时)才会包含实际结果。 await 关键字将导致您的代码在该行“暂停”并等待 ExecuteAsync 任务包含实际值。然后你的逻辑可以继续。

    请注意,方法签名已更改:现在是 async Task&lt;bool&gt; rowExists。您的方法现在也返回一个Task,这意味着调用this 方法的代码也必须使用await。这是处理数据库和网络调用等异步操作的常见模式。

    如果这看起来很奇怪,您可以在此处阅读有关 async/await 模式的更多信息:

    【讨论】:

    • 太棒了,谢谢!我对异步编程一点也不熟悉。
    • @AndrewBuikema 没问题!一开始需要花一点时间来绕开你的头。我在我的答案底部添加了一些链接,以了解一些关于 C# 中异步的好读物。
    • @AndrewBuikema 欢迎来到 Stack Overflow 顺便说一句!如果我的回答解决了您的问题,请随时单击复选标记将其标记为已接受的答案。干杯!
    • 是的,我本来打算这样做,但 SO 让我等了 10 分钟才能接受答案。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2019-01-19
    • 2013-02-22
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多