当前位置: 首页 > 知识库问答 >
问题:

使用ContinueAnd时无法启动第二个操作

苍嘉澍
2023-03-14

我有一个循环,在循环中我正在做:

await Task.Delay(1000, ct).ContinueWith(async _ =>
{
    await SecondMethodAsync(ct);
});

第二种方法使用EF获取实体,设置一些属性,并通过调用DbContext上的wait SaveChangesAsync()将实体保存回数据存储。

上面应该等待1s,然后继续第二种方法。通过上述实现,我得到以下异常:

在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全。

当我将上述内容更改为:

await Task.Delay(1000, ct);
await SecondMethodAsync(ct);

一切正常。

以上两个代码段有什么不同?如何使第一个代码段工作?

共有2个答案

欧阳勇
2023-03-14

我认为原因如下。如果我错了,请纠正我。

异步的lambda在ContinueWith中返回任务,这意味着ContinueWith实际上是在获得任务后立即完成的(而不是在任务完成时)。程序流直接进入下一个循环迭代,并再次命中DBContext。

因此,以下操作也可能有效,因为ContinueAnd的返回类型是任务

await await Task.Delay(1000, ct).ContinueWith(async _ => {
    await SecondMethodAsync(ct); 
});

周涵畅
2023-03-14

来自任务之旅,第7部分:异步/等待大师Stephen Cleary的继续:

总之,我根本不建议使用ContinueAnd,除非您正在进行动态任务并行(这非常罕见)。在现代代码中,您几乎应该总是使用wait而不是ContinueAnd。等待有几个好处。

你知道解决方案,这很棒:

await Task.Delay(TimeSpan.FromSeconds(1), ct);
await SecondMethodAsync(ct);
 类似资料:
  • 在我的控制器中,我在保存到DB的日期之后执行另一个Void函数。但有时会出现这种错误: 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全。 ...下面是我的控制器示例: 下面是Void方法: 我怎么解决这个问题?

  • 我刚开始使用Xamarin和VisualStudio2017在C#中为Android开发。与Windows生态系统完全不同的范例…Target是一个商业应用程序,将有特定的受众,但在我深入了解之前,我只是试图学习绳子,理解概念和程序… 因此,我从最简单的app开始,使用空白模板。这将创建一个项目,其中包含一个活动(mainactivity.cs)、两个资源(resources\layout\mai

  • 问题内容: 我正在尝试从JavaFx应用程序内部启动JavaFx应用程序,但是看起来Application.launch()只能被调用一次。这是否意味着我必须像exec(“ java …”中那样启动一个单独的JVM …还是还有另一种方法? 更多背景信息。我希望我的JavaFx应用程序能够构建和运行JavaFx应用程序。现在,它可以在内存中编译类,装入类…真的很不​​幸,不得不诉诸一切将文件写入文件

  • 我试图从JavaFx应用程序中启动JavaFx应用程序,但看起来application.launch()只能调用一次。这是否意味着我必须启动一个单独的JVM...就像在exec(“java.......或者还有其他方法吗? 作为次要问题...是否有方法打开另一个JavaFx窗口,获取stage并将其传递给我新编译和加载的应用程序子类?

  • 我得到了关于在上一个异步操作结束之前在上下文上启动第二个异步操作的错误,但我没有看到它发生在哪里。这是我正在使用的代码。每个异步调用都使用await,那么我做错了什么? 这是Web API 2调用上的一种方法。 当它到达最后一行时,就是抛出异常的地方。 异常消息: 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实

  • 我是Spring运动的新手。我创建了流程,即 开始--- 现在我必须将动态受让人分配给两个用户任务。我已使用以下命令将受让人发送给第一个用户任务: 现在,当我从中完成任务时http://localhost:8080/activiti-浏览器/用户界面/然后侦听器,服务任务表达式正在工作。有人能帮我吗。我想把这两个用户任务都分配给“charnjeet”。