Entity Framework DbContext异步传参是否违反线程安全规则?
关于Entity Framework DbContext线程安全的问题解答
你的代码是否违反线程安全规则?
不违反。你的代码中所有对LostWorldsContext实例的操作都是串行执行的:
- 在
TestingAsync方法里,你先创建DbContext实例,然后通过await RetrieveMatch(...)等待异步查询完成,这意味着只有当RetrieveMatch里的数据库操作完全结束后,才会继续执行后续修改m.MaxPlayers和调用SaveChangesAsync()的代码。 - 整个过程中,DbContext的所有操作都没有被多个线程同时执行,完全符合DbContext的使用要求。
逐个await异步方法时传递DbContext是否安全?
是安全的。DbContext的线程安全风险本质是多个线程同时对同一个实例进行读写操作,而如果所有使用该DbContext的异步方法都通过await串行执行——即前一个异步操作完成后才启动下一个操作——那么同一时间只会有一个操作在使用DbContext实例,不会出现并发访问的场景,也就不会触发线程安全问题。
需要注意:绝对不要在未使用await的情况下并行启动多个使用同一个DbContext的异步任务(比如用Task.WhenAll同时执行多个操作),这种情况会导致多个线程同时操作DbContext,引发线程安全问题。
内容的提问来源于stack exchange,提问作者Sean Gailey
相关产品推荐
相关产品推荐

