【发布时间】:2016-06-17 20:19:06
【问题描述】:
在 Windows 桌面应用程序中,上下文与视图一样长,避免“在前一个异步操作完成之前在此上下文上启动第二个操作”错误的最佳方法是什么?
在我的视图模型中,我收到了一个存储库实例(通过构造函数),它包装了一个长期存在的 DbContext 实例,当我需要加载一些数据时,例如,如果我从同一个方法中加载,那么我可以在 async 方法中等待它们中的每一个,这样可以确保它们同步执行。
但是,想象一下我有这个:
private async void SomeMethodA()
{
await Context.GetA();
}
private async void SomeMethodB()
{
await Context.GetB();
}
它们被声明为 void,因为它们实际上是一些事件处理程序。所以,我的代码执行 SomeMethodA(),这个数据库调用可能需要 2 秒。因此,代码执行返回到 UI 线程,然后某些东西(用户或代码)触发 SomeMethodB(),这将引发上述异常。
确保异步数据库调用排队的最佳方法是什么?存储库是处理此问题的最佳场所吗?
【问题讨论】:
-
存储库模式旨在将您的域模型与您的业务逻辑分开,这在此用例中对您没有帮助。在您的示例中,您有一个业务规则问题,您正在使用异步等待。例如,当您调用 SomeMethodA 时,方法 someMethodB() 的方法按钮将被禁用,直到方法 A 完成或等待 TaskA 通过使用帮助您继续的 TaskCompletionSource 完成。
-
@BassamAlugili SomeMethodB 可以通过代码 sn-p 调用,例如来自某个侦听器、计时器等的某些事件。所以,我不能依赖于禁用任何东西,它不必是用户交互。
-
@StephenCleary 已经给你答案了。他是 C# 中的多任务之王。
标签: c# entity-framework entity-framework-6 async-await