eye*_*aul 3 .net c# asp.net-mvc entity-framework async-await
使用VS2013,EF6.1.1,MVC5,.net 4.5.
我刚开始第一次看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");
}
Run Code Online (Sandbox Code Playgroud)
我的服务类如下:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的存储库方法:
public async Task<TEntity> FirstOrDefaultAsync()
{
return await _entitySet.FirstOrDefaultAsync();
}
Run Code Online (Sandbox Code Playgroud)
基本上,我有一个控制器方法,它调用一个服务方法.服务方法是以异步方式调用数据库层两次.但我觉得我正在改变每一个方法和层来处理异步,我不确定我在这里有什么是正确的.
其次,在控制器方法中,我不确定如何异步调用工作单元的提交方法.包含"_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);
}
Run Code Online (Sandbox Code Playgroud)
我在你的代码中看到了一个重复出现的模式:
private async Task<TestObject> privateMethod2Async()
{
return await _testRepository.FirstOrDefaultAsync();
}
Run Code Online (Sandbox Code Playgroud)
如果你有一个只需查询你的数据库的单行程序Task<T>,你可以避免导致的状态机分配await,并简单地将热任务返回给调用者(因为他可能会等待它更高的呼叫 -链):
private Task<TestObject> privateMethod2Async()
{
return _testRepository.FirstOrDefaultAsync();
}
Run Code Online (Sandbox Code Playgroud)
请注意,async-await这会让你"一路异步",这就是异步的本质.例如,确保将可以并发运行的任务分组Task.WhenAll(例如,不确定这可能是最好的示例):
public async Task<TestObject> TestMethod1()
{
var testObject1 = await privateMethod1Async();
if (testObject1 != null) return testObject1;
testObject1 = await privateMethod2Async();
return testObject1;
}
Run Code Online (Sandbox Code Playgroud)
可能会变成:
return Task.WhenAny(privateMethod1Async(), privateMethod2Async());
Run Code Online (Sandbox Code Playgroud)
鉴于其中一种方法适用于返回类型.
编辑:
添加async/await的一般规则经验法则是什么?它是否用于进行其他处理的方法?哪,正如你所指出的,这种方法不适用?
await当您想要对返回的内容进行更多处理时,您可能希望使用Task.如果您想要的只是返回实际值Task,则无需等待它,您只需返回热门任务即可.这是我使用的一般规则.另请注意,当您使用return awaitvs 时,异常处理会有所不同return.
您可以在异步方法结束时阅读更多内容,我应该返回还是等待?和"await Task.Run(); return;"之间的任何区别 并"返回Task.Run()"?
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |