2016-11-22 108 views
0

我的WCF服务中有一个Main方法。请帮我指出我需要将Aync和Await放在哪里。我有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; 
} 
+0

是在GetobjectValue方法依赖于updatetable方法是运行第一? – auburg

+0

编号更新和获取都是分开的过程,并且是独立的 – Marid

回答

1

首先,你开始你的数据库调用,例如,使用异步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; 
} 
+0

好奇,一旦你知道一个任务完成了,有没有什么优势可以通过getTask.Result等待getTask? – sellotape

+0

啊回答我自己,我猜它会抛出任何悬而未决的异常? – sellotape

+1

@selotape:他们都会抛出异常,但是'await'会抛出你期望的异常。 'Result'在“AggregateException”中包装任何异常。此外,“await”对代码更改具有更强的适应性(例如,如果重构方法并且现在任务可能完成或可能未完成)。 –