【发布时间】:2015-03-04 02:00:07
【问题描述】:
使用 VS2013、EF6.1.1、MVC5、.net 4.5。
我刚刚开始第一次研究 async/await,我不确定这是否正确。它似乎工作,但它可以更简单吗?我似乎在很多地方都坚持 async/await 以实现一种方法调用多层。
为简洁起见,所有代码均已简化。
在我的 MVC 控制器操作方法中,我有:
public async Task<ActionResult> TestAction1()
{
var testResponse = await _testService.TestMethod1(1);
if (testResponse != null)
{
_unitOfWork.CommitAsync();
return View(testResponse);
}
return RedirectToAction("TestAction2");
}
我的服务类如下:
public class TestService : ITestService
{
public async Task<TestObject> TestMethod1()
{
var testObject1 = await privateMethod1Async();
if (testObject1 != null) return testObject1;
testObject1 = await privateMethod2Async();
return testObject1;
}
private async Task<TestObject> privateMethod1Async()
{
return await _testRepository.FirstOrDefaultAsync();
}
private async Task<TestObject> privateMethod2Async()
{
return await _testRepository.FirstOrDefaultAsync();
}
}
还有我的存储库方法:
public async Task<TEntity> FirstOrDefaultAsync()
{
return await _entitySet.FirstOrDefaultAsync();
}
基本上,我有一个控制器方法,它调用一个服务方法。服务方法是以异步方式调用数据库层两次。但我觉得我正在改变每一个方法和层来处理异步,我不确定我这里的内容是否正确。
其次,在控制器方法中,我不确定如何异步调用工作单元提交方法。具有“_unitOfWork.CommitAsync();”的行。我不能在它前面加上一个“等待”,因为它是一个无效的方法。
有什么想法吗?
编辑 1
这是对 EF 的存储库方法调用的完整版本:
public async Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>>
predicate, params
Expression<Func<TEntity, object>>[]
includeProperties)
{
IQueryable<TEntity> query = EntitySet;
if (includeProperties != null && includeProperties.Any())
{
query = IncludeProperties(query, includeProperties);
}
return await query.FirstOrDefaultAsync(predicate);
}
【问题讨论】:
-
具有“_unitOfWork.CommitAsync();”的行。我不能在它前面加上“等待”,因为它是一个无效的方法。
public async Task CommitAsync() { ... }. -
啊,好吧,我想我对它的返回无能为力。所以没有办法使用 await 与我失踪的 void?
-
我想我对它的回报无能为力。不,你可以
await它。 -
好的,谢谢。剩下的呢?我似乎在为每个方法和层添加相同的 async/await 内容,对吗?
标签: c# .net asp.net-mvc entity-framework async-await