将方法转换为异步调用Write四十次的正确方法?

时间:2014-04-25 12:35:21

标签: c# file-io async-await

我有一种方法可以将特殊格式的数据以StreamWriter写入的速度快照到文件中。此时,有许多单独的StreamReader.Write调用,因为在缓冲StreamWriter已经发生的情况下,发现它比字符串连接/缓冲更快。

所以问题是,我是否等待所有四十次写入调用,其中大多数每次写入一到十个字符?这看起来很难看。

在致电FlushAsync之前,我可以确保没有任何内容被刷新吗?如果我使用同步写入然后在最后调用FlushAsync,那可能会破坏StreamWriter缓冲策略吗?

最终目标是1)用户界面没有延迟,2)尽快保存文件。这是一个大量的数据。

2 个答案:

答案 0 :(得分:0)

如果符合你的逻辑,我会按照以下方式进行:

  1. streamWriter.AutoFlush设为false
  2. 进行写作"同步"
  3. 致电await streamWriter.FlushAsync()
  4. 这应该像CPU /内存一样快地填充缓冲区,然后释放线程,同时实际写入磁盘。请注意,在您手动调用FlushFlushAsyn之前,不会将任何内容写入磁盘。发生异常。

    由于订单很重要,您无法并行运行写入,但如果这有助于您的程序流程,您可以将整个操作放入后台运行Task

    Task.Run(async () =>
        {
            streamWriter.AutoFlush = false;
            // write to writer
            await streamWriter.FlushAsync();
        });
    

答案 1 :(得分:0)

你需要异步IO吗?它通常是CPU密集型的(就像你的情况一样 - 你对此非常正确)。只需使用同步IO在线程池线程上运行IO工作。这看起来像这样:

await Task.Run(() => MyIOFunction());

您不必担心并发问题,因为await会暂停程序的其余部分直到后台线程完成。

异步IO不是基于等待。完成IO后,操作系统会回叫您。它倾向于使用更多的CPU。 Async IO用于以方便的方式解锁UI并进行扩展。它对CPU效率没有帮助。