C# 修改数据时安全异步保存?

C# 修改数据时安全异步保存?,c#,asynchronous,C#,Asynchronous,我正在做一个小项目,我需要在任何时候不断地模拟(修改)多个超大对象数据。修改就像链接的网格一样复杂——大量对象的内部数据也被抛出、交换和计算 但是,我还希望通过异步将定时保存(DTO映射+序列化)到多个分组文件中,以防止其不断出现口吃,因为保存过程相当繁琐 在一直修改数据的同时异步保存是否安全?如果没有,我可以做什么选择 同时,你可能会告诉我克隆这个对象,这样保存起来就安全了——但这只是偏离了我的目标——这些对象实在太大了 项目将过程分为两部分:在检查保存之前模拟对象。因此,是的,只有在模拟过程

我正在做一个小项目,我需要在任何时候不断地模拟(修改)多个超大对象数据。修改就像链接的网格一样复杂——大量对象的内部数据也被抛出、交换和计算

但是,我还希望通过异步将定时保存(DTO映射+序列化)到多个分组文件中,以防止其不断出现口吃,因为保存过程相当繁琐

在一直修改数据的同时异步保存是否安全?如果没有,我可以做什么选择

同时,你可能会告诉我克隆这个对象,这样保存起来就安全了——但这只是偏离了我的目标——这些对象实在太大了


项目将过程分为两部分:在检查保存之前模拟对象。因此,是的,只有在模拟过程之外进行保存时才有效。这就是为什么我问异步是否安全,因为我不完全理解它


我的下一个问题是,保存是否会发生在模拟过程中?如果是这样的话,我还可以用什么方法来节省而不影响模拟速度?或者可能需要对异步保存过程执行一些模式,这样它就不会保存在模拟过程中?

异步就像多线程一样,尽管它不会创建任何线程,但我真的不明白为什么。在这种情况下,我将无法在模拟对象时保存它们,因为IO将中断模拟

  • 异步IO不安全

  • 保存将在模拟过程中发生

  • 解决方案是在某一点未使用时停止并缓存模拟中的部分对象,这将提高性能,并允许保存缓存的对象。保存过程是排队的,其中保存对象的任务将按照以下条件逐一执行

异步任务分配条件:

  • 如果在开始保存排队对象的任务之前再次将对象重新激活到模拟中,则将取消保存,并且对象将在不中断的情况下重新激活。保存将移到下一个排队对象
  • 如果要在保存时重新激活对象,则必须等待线程,直到保存该特定对象的任务最终完成

真正的问题是,将一个状态的一部分保存为另一个状态的一部分是否可以接受,或者对象是否只有在冻结时才有效?项目将过程分为两部分:在检查保存之前模拟对象。因此,是的,只有在模拟过程之外进行保存时才有效。这就是为什么我问异步是否安全,因为我不完全理解它。是否会在模拟过程中进行保存?如果是这样的话,我还可以用什么方法来节省而不影响模拟速度?或者对异步保存进程执行某种模式,使其不会保存在模拟进程中?async/await用于释放线程。通常是通过WPF这样的应用程序完成的,这样GUI线程就不会挂起,而ASP.NET这样的应用程序就可以为另一个传入的请求提供服务。它与并行处理或多线程无关。无论哪种方式,save操作都将花费相同的时间,并且将根据相同的规则失败或成功。所以在一个硬壳中,您的业务逻辑不应该受到任何方式的影响。哦,那么异步只适用于GUI应用程序?我的项目不是GUI。是。。。好。。。游戏项目。我提到的对象实际上是游戏对象——但不是简单的对象。如果有一个主消息泵,或者如果用于保存的线程应该尽快释放,那么async/await可能会有用。另一个指标是应用程序类型是否本机支持它。控制台应用程序没有,windows服务也没有。WPF有,ASP.NET也有。不确定代码的宿主是什么,但这可能是一个很好的指示。