【问题标题】: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 方法?
  • 没有。更新和获取都是独立的过程并且是独立的

标签: c# asynchronous async-await


【解决方案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 对代码更改更具弹性(例如,如果方法被重构并且现在任务可能完成也可能不完成)。
猜你喜欢
  • 1970-01-01
  • 2020-07-11
  • 2021-10-13
  • 2019-03-03
  • 2020-05-12
  • 1970-01-01
  • 2023-03-12
  • 2013-10-17
相关资源
最近更新 更多