Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;在上一个异步操作完成之前,在此上下文上启动了第二个操作;添加后。configurewait(false);_C#_.net_Multithreading_Asynchronous_Async Await - Fatal编程技术网

C# &引用;在上一个异步操作完成之前,在此上下文上启动了第二个操作;添加后。configurewait(false);

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)我得到一个错误 “在上一个

我有一个方法,我想在其中执行3个异步方法。其中2个(Method1和Method3)使用dbContext查询数据

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
,为什么它显然没有发现同样的问题,这真的很重要吗?在预期方法共享将同时执行的情况下,您不适当地共享单个上下文对象。不管“为什么”,你都需要解决这个问题。