如何使用异步等待

Posted

技术标签:

【中文标题】如何使用异步等待【英文标题】:How to use Async Await 【发布时间】:2016-11-22 13:47:34 【问题描述】:

我的 WCF 服务中有一个 Main 方法。请帮我指出我需要将 Aync 和 Await 放在哪里。我在 main 方法中有 2 个方法,一个方法更新表,另一个方法从 SQl 获取值,然后我将值作为对象返回给客户端。我希望 2 个方法并行执行。我想快速将对象返回给客户端

public object GetSensorConfiguration(string desc)

   object oObject = null;
   UpdateTable(desc);
   oObject = GetobjectValue(desc);
   return oObject ;


private void updatetable(string desc)

    // no return value.. just update    


private object GetobjectValue(string desc)

    object objA = null;
    //Get values for the objA;
    return objA;

【问题讨论】:

GetobjectValue 方法是否依赖于先运行的 updatetable 方法? 没有。更新和获取都是独立的过程并且是独立的 【参考方案1】:

首先,您从数据库调用开始,例如,使用 Entity Framework 中可用的异步 API:

private async Task UpdateTableAsync(string desc)

  ...
  await db.SaveChangesAsync();


private async Task<object> GetObjectValue(string desc)

  object objA = await ...;
  return objA;

然后您可以在“主要”方法中使用它们。既然你想同时执行它们(不是“并行”),那么你会想使用Task.WhenAll

public async Task<object> GetSensorConfiguration(string desc)

  var updateTask = UpdateTableAsync(desc);
  var getTask = GetObjectValueAsync(desc);
  await Task.WhenAll(updateTask, getTask);
  return await getTask;

【讨论】:

很好奇,一旦您知道任务已完成,等待 getTask 是否比 getTask.Result 更有优势? 啊,为自己回答,我猜它会引发任何未决的异常? @sellotape:它们都抛出异常,但 await 会抛出你所期望的异常。 Result 将任何异常包装在 AggregateException 中。此外,await 对代码更改更具弹性(例如,如果方法被重构并且现在任务可能完成也可能不完成)。

以上是关于如何使用异步等待的主要内容,如果未能解决你的问题,请参考以下文章

如何将异步等待与 https 发布请求一起使用

如何使用回调在任何函数中调用异步等待方法

如何使用异步等待

如何使用异步发布并使用 HttpClient 等待

如何等待异步函数执行?

如何在“react-dropzone”的“onDrop”中使用异步等待? (解析错误:不能在异步函数之外使用关键字'await')