处理异步函数的空响应的正确方法是什么?

时间:2018-03-14 15:37:09

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

我正在开发一个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")}");

1 个答案:

答案 0 :(得分:4)

您没有得到预期的结果,因为您的代码不等待异步请求完成。您需要更改功能以正确调用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关键字会导致您的代码暂停&#34;暂停&#34;在该行上等待ExecuteAsync任务包含实际值。然后你的逻辑可以继续。

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

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