我有要执行3个异步方法的方法。其中2个(方法1和方法3)使用dbContext查询数据。
await Task.WhenAll(Method1(dbContext), Method2(), Method3(dbContext)).ConfigureAwait(false);;
await seedSession.SaveChangesAsync().ConfigureAwait(false);
使用.ConfigureAwait(false);
时出现错误
“在先前的异步操作完成之前,第二个操作在此上下文上开始”
在没有.ConfigureAwait(false);
的情况下,一切正常。
Method1和Method3是否存在问题,它们使用相同的上下文在同一时间进行查询?
Method1仅更新db中的数据... Method2-更新blob中的数据,Method3-更新与数据库同步的azure表中的数据...因此Method1和Method3可以“访问” db
答案 0 :(得分:3)
您的问题的答案非常简单,正如许多评论所建议的那样,您不能在需要并行调整的两个异步方法上使用单个上下文。
无论您是否使用ConfigureAwait(false),由于三种方法中的两种共享上下文,所以仍然存在一个基本的设计缺陷,随时可能在您的面前夸大其词。
看到50/50通过/失败率的原因很可能取决于您的方法在后台执行的方式。这可能会有所不同,有时有时Method1可能在Method3需要访问数据库之前就已完成,然后您看不到错误。
但这又不是真正的问题。
要解决此限制,您要么必须同步运行您的方法(让它们互相等待),要么必须重组您的方法,以便其中只有一个负责数据库的访问/更新。这是我对你的建议。
这是一篇不错的文章,似乎建议您不要使用ConfigureAwait(false),也许您对此很感兴趣。 here。
希望这会有所帮助。