【发布时间】:2014-07-18 22:22:01
【问题描述】:
如何避免为异步和非异步方法编写两次相同的代码。 我目前正在使用 ASP.NET,所以我目前在请求线程上,我很快了解到他下面的代码(应该显示我的意图),绝对是错误的做法。
应用程序死锁,因为 await 关键字试图返回 .Result 阻塞的同一线程。
我这样做的全部原因是为了避免两次编写相同的“FindAll”代码。
public IEnumerable<Resource> FindAll()
{
return FindAllAsync().Result;
}
public async Task<IEnumerable<Resource>> FindAllAsync()
{
return await Context.Resources.ToListAsync();
}
那么你如何解决这个问题?
【问题讨论】:
-
可以说,除非您想支持取消,否则您不需要同步和异步。给定
IEnumerable<T>的延迟迭代模型,任何迭代的取消都是免费的。 -
可以说我可以再举一个例子,返回另一个对象,但问题仍然存在。这个问题不是关于 IEnumerable 而是从同步上下文调用异步方法。
-
为什么需要这两种方法? (另外,请考虑根本不使用异步数据库查询。您可以在同一个应用程序中混合使用同步和异步,没有任何劣势。)
-
@Gusdor。这是我的问题,我并不是说你不对,但我的问题不是关于 IEnumerable,而是我在使用 async/await 时面临的挑战。无论返回类型如何,返回类型都不会改变上述代码会导致死锁的事实。
-
@usr 请提供一个答案,并举例说明您的建议。
标签: c# .net asp.net-mvc async-await