【问题标题】:CloudTable ExecuteQuery asyncCloudTable ExecuteQuery 异步
【发布时间】:2014-02-24 12:51:02
【问题描述】:

是否可以异步运行 ExecuteQuery?

考虑以下代码:

public virtual MyEntity MyMethod(string parm1, string parm2)
{
     string queryString = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, parm1),
                                                    TableOperators.And,
                                                    TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, parm2));
     TableQuery<MyEntity> query = new TableQuery<MyEntity>().Where(queryString);

     return TenantTnsTable.ExecuteQuery(query).ToList().FirstOrDefault();
}

是否可以将此设为异步方法并在 ExecuteQuery 调用中使用 await?

【问题讨论】:

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


【解决方案1】:

试试Task.Run。您应该能够异步运行任何非异步代码,然后await 结果。

【讨论】:

  • 这不是正确的异步,它是异步超过同步。如果需要在后台线程中完成,最好保留同步方法并让调用者将其包装在对 Run 的调用中,但如果他们不在后台线程中,则允许他们避免这种开销事实上需要它。
  • 最好使用Task.FromResult
【解决方案2】:

您可以使用 Task.Factory.FromAsync 包装旧式回调。例如:

public static Task<TableQuerySegment<T>> ExecuteQueryAsync<T>(
        this CloudTable table,
        TableQuery<T> query,
        TableContinuationToken token,
        CancellationToken ct = default(CancellationToken))
        where T : ITableEntity, new()
    {
        ICancellableAsyncResult ar = table.BeginExecuteQuerySegmented(query, token, null, null);
        ct.Register(ar.Cancel);

        return Task.Factory.FromAsync<TableQuerySegment<T>>(ar, table.EndExecuteQuerySegmented<T>);
    }

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2016-08-27
    • 2020-10-05
    • 2021-10-27
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多