2016-08-06 322 views
1

一个简单的问题。我发现了一些具有这种“逻辑”和“架构”的方法。c#异步方法和返回等待

public async Task<T> FindAsync(params object[] keys) 
{ 
    return await this.context.FindAsync(keys); 
} 

一个单一的指令与它的等待。由于该方法是异步的,你必须这样做(否则会发生编译器错误)。 恕我直言,我找不到为什么你应该使用这种模式,因为如果方法是异步的,你可能想要并行执行不同的任务。如果将执行与await关键字同步,则会使该方法接近同步,并且会放弃.net的托管线程池机制的所有性能增益。 您的意见是?我错了?

+0

你不需要使用await;在这种情况下,您必须删除async和await关键字。可能这里唯一的好处是,如果有异常,这个FindAsync方法将出现在调用堆栈中。 –

+0

'await'不会使代码同步。 'async' /'await'与线程池没有任何关系。你可能会发现我的['async' intro](http://blog.stephencleary.com/2012/02/async-and-await.html)有帮助。 –

回答

1

如果你调用此方法是这样的:

await FindAsync(); // this method waits for the task to complete 

然后它没有任何意义,返回此方法内等待,你可以将其更改为:

public Task<T> FindAsync(params object[] keys) 
{ 
    return this.context.FindAsync(keys); // Start and return the task 
} 

然后调用者等待任务完成。

+0

我同意你的意见。异步方法的调用者应该等待所有的异步方法,以便并行地优化和运行代码的某些部分(异步方法)。 – user2957271