添加.ConfigureAwait(false);

时间:2019-01-21 13:35:37

标签: c# .net multithreading asynchronous async-await

我有要执行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

1 个答案:

答案 0 :(得分:3)

您的问题的答案非常简单,正如许多评论所建议的那样,您不能在需要并行调整的两个异步方法上使用单个上下文。

无论您是否使用ConfigureAwait(false),由于三种方法中的两种共享上下文,所以仍然存在一个基本的设计缺陷,随时可能在您的面前夸大其词。

看到50/50通过/失败率的原因很可能取决于您的方法在后台执行的方式。这可能会有所不同,有时有时Method1可能在Method3需要访问数据库之前就已完成,然后您看不到错误。

但这又不是真正的问题。

要解决此限制,您要么必须同步运行您的方法(让它们互相等待),要么必须重组您的方法,以便其中只有一个负责数据库的访问/更新。这是我对你的建议。

这是一篇不错的文章,似乎建议您不要使用ConfigureAwait(false),也许您对此很感兴趣。 here

希望这会有所帮助。