C# &引用;在上一个异步操作完成之前,在此上下文上启动了第二个操作;添加后。configurewait(false);
我有一个方法,我想在其中执行3个异步方法。其中2个(Method1和Method3)使用dbContext查询数据C# &引用;在上一个异步操作完成之前,在此上下文上启动了第二个操作;添加后。configurewait(false);,c#,.net,multithreading,asynchronous,async-await,C#,.net,Multithreading,Asynchronous,Async Await,我有一个方法,我想在其中执行3个异步方法。其中2个(Method1和Method3)使用dbContext查询数据 await Task.WhenAll(Method1(dbContext), Method2(), Method3(dbContext)).ConfigureAwait(false);; await seedSession.SaveChangesAsync().ConfigureAwait(false); 使用.ConfigureAwait(false)我得到一个错误 “在上一个
await Task.WhenAll(Method1(dbContext), Method2(), Method3(dbContext)).ConfigureAwait(false);;
await seedSession.SaveChangesAsync().ConfigureAwait(false);
使用.ConfigureAwait(false)代码>我得到一个错误
“在上一个异步操作完成之前,在此上下文上启动了第二个操作”
当它没有.ConfigureAwait(false)时代码>-一切正常
Method1和Method3使用相同的上下文在同一时间进行查询,这两种方法中是否存在问题
方法1只是更新数据库中的数据。。。方法2-更新Blob中的数据,方法3-更新azure表中的数据并同步到db。。。因此,Method1和Method3可以“访问”db您的问题的答案非常简单,正如许多评论所建议的,您不能在需要并行tun的两个异步方法上使用单一上下文
无论您是否使用ConfigureAwait(false),您仍然存在一个基本的设计缺陷,因为这三种方法中的两种方法共享一个上下文,因此该缺陷随时可能在您面前爆发
您看到50/50通过/失败率的原因很可能取决于您的方法在后台的执行方式。这可能会有所不同,有时Method1可能在Method3需要访问数据库之前完成,然后您就看不到错误了
但这也不是真正的问题
要绕过此限制,您必须同步运行方法(让它们彼此等待),或者必须重新构造方法,以便其中只有一个负责DB访问/更新。这是我给你的建议
这里有一篇很好的帖子,它似乎反对使用ConfigureAwait(false),也许这是您感兴趣的
希望这有帮助。您的问题的答案非常简单,正如许多评论所建议的,您不能在两个需要并行tun的异步方法上使用单一上下文
无论您是否使用ConfigureAwait(false),您仍然存在一个基本的设计缺陷,因为这三种方法中的两种方法共享一个上下文,因此该缺陷随时可能在您面前爆发
您看到50/50通过/失败率的原因很可能取决于您的方法在后台的执行方式。这可能会有所不同,有时Method1可能在Method3需要访问数据库之前完成,然后您就看不到错误了
但这也不是真正的问题
要绕过此限制,您必须同步运行方法(让它们彼此等待),或者必须重新构造方法,以便其中只有一个负责DB访问/更新。这是我给你的建议
这里有一篇很好的帖子,它似乎反对使用ConfigureAwait(false),也许这是您感兴趣的
希望这有帮助。您不能使用相同的上下文并行运行查询。@DavidG,是的,逻辑上。。。但是为什么它在没有.ConfigureAwait(false)
的情况下工作呢?对我来说,它可能是50分50秒才能工作什么是50分50秒
?@colim五十五分50秒没有ConfigureAwait
,为什么它显然没有发现同样的问题,这真的很重要吗?在预期方法共享将同时执行的情况下,您不适当地共享单个上下文对象。无论“为什么”,您都需要解决这个问题。您不能使用相同的上下文并行运行查询。@DavidG,是的,它在逻辑上是。。。但是为什么它在没有.ConfigureAwait(false)
的情况下工作呢?对我来说,它可能是50分50秒才能工作什么是50分50秒
?@colim五十五分50秒没有ConfigureAwait
,为什么它显然没有发现同样的问题,这真的很重要吗?在预期方法共享将同时执行的情况下,您不适当地共享单个上下文对象。不管“为什么”,你都需要解决这个问题。