如何使用异步等待
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
对代码更改更具弹性(例如,如果方法被重构并且现在任务可能完成也可能不完成)。以上是关于如何使用异步等待的主要内容,如果未能解决你的问题,请参考以下文章
如何在“react-dropzone”的“onDrop”中使用异步等待? (解析错误:不能在异步函数之外使用关键字'await')