gpt4 book ai didi

c# - 异步写入文件,但顺序

转载 作者:行者123 更新时间:2023-11-30 20:23:02 25 4
gpt4 key购买 nike

我有一些代码可以将数据从对象保存到 XML。这会锁定 UI 几秒钟,所以我做了它,所以它不会。

foreach (Path path in m_canvasCompact.Children)
{
Task.Run(() => WritePathDataToXML(false, path));
}

Private void WritePAthDataToXML(bool is32x32, Path path)
{

//stuff going on...

xmlDoc.Root.Descendants.......Add(iconToAdd);
xmlDoc.Save(..);
}

问题是(正如预期的那样)数据写入 XML 的顺序是随机顺序,具体取决于任务完成的速度(我假设)

我可能会编写一些代码来查看 XML 并在所有内容完成后重新排列它,但这并不理想。无论如何,是否可以在单独的线程上执行此操作,但一次可能只有一个,以便它们以正确的顺序执行和保存。

谢谢。

最佳答案

听起来你想要一个生产者/消费者队列。你可以很容易地使用 BlockingCollection<T> 来组装它.

  1. 创建阻塞集合
  2. 启动一个任务,该任务将从集合中读取直到“完成”(使用 GetConsumingEnumerable 最简单),然后写入文件
  3. 将所有相关项目添加到集合中 - 确保您在 UI 线程中执行一切接触 UI 元素的操作。
  4. 告诉集合它“完成”了( CompleteAdding )

或者,如评论中所建议的:

  • 在 UI 线程中,创建一个集合,其中包含您需要从 UI 元素获取的所有信息 - 基本上您不想在非 UI 线程中触及 UI 元素。
  • 启动一个任务将该集合写入磁盘;可选择等待该任务(不会阻塞 UI)

这更简单,但这确实意味着在开始编写之前在内存中构建整个集合。使用第一种方法,您可以在编写时添加到集合中——尽管如果构建集合比写入磁盘快得多,您完全有可能最终将整个内容都保存在内存中。如果这不可行,您将需要某种方式从 UI 线程“轻轻地”添加,而不阻塞它。如果 BlockingCollection 就好了有一个AddAsync方法,但我看不到。

我们对你用 Path 做什么了解得不够多元素来为您提供示例代码,但希望这足以作为一个起点。

关于c# - 异步写入文件,但顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com