我有一种方法可以将特殊格式的数据以StreamWriter
写入的速度快照到文件中。此时,有许多单独的StreamReader.Write
调用,因为在缓冲StreamWriter
已经发生的情况下,发现它比字符串连接/缓冲更快。
所以问题是,我是否等待所有四十次写入调用,其中大多数每次写入一到十个字符?这看起来很难看。
在致电FlushAsync
之前,我可以确保没有任何内容被刷新吗?如果我使用同步写入然后在最后调用FlushAsync
,那可能会破坏StreamWriter
缓冲策略吗?
最终目标是1)用户界面没有延迟,2)尽快保存文件。这是一个大量的数据。
答案 0 :(得分:0)
如果符合你的逻辑,我会按照以下方式进行:
streamWriter.AutoFlush
设为false
await streamWriter.FlushAsync()
这应该像CPU /内存一样快地填充缓冲区,然后释放线程,同时实际写入磁盘。请注意,在您手动调用Flush
或FlushAsyn
之前,不会将任何内容写入磁盘。发生异常。
由于订单很重要,您无法并行运行写入,但如果这有助于您的程序流程,您可以将整个操作放入后台运行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效率没有帮助。