使用CsvHelper编写异步代码的正确方式

3

请问如何使用CsvWriter在不阻塞的情况下写入对象列表?对我来说并不明显。

我需要先调用WriteRecords()然后再调用FlushAsync(),还是应该使用NextRecordAsync()逐个写入每个对象?

实际上,我希望有一个专门的方法可以使用,但它并不存在:

最初的回答:

public Task WriteRecordsAsync(...);

2
截至2020年1月16日,版本13.0.0现在有一个专用的方法:Task CsvWriter.WriteRecordsAsync<T>(IEnumerable<T> records) - ThePersonWithoutC
1个回答

3

WriteRecords 会代替你调用 NextRecord,因为它在写入多条记录时需要这样做。因此,你需要手动编写这些记录。只需再添加几行代码即可。

foreach (var record in records)
{
    csv.WriteRecord(record);
    await csv.NextRecordAsync();
}

没有 WriteRecordsAsync 的原因是它不是必需的。这基本上只会复制库中大部分代码,只是为了节省几行代码。系统中仅在写入 TextWriter 时才需要低级别的 async,因此尽可能少的使用 async


我不喜欢使用那么多的continuation这个想法,但或许这没关系。如果我改用WriteRecords()和FlushAsync()会不会也是non-blocking的呢?我不确定,因为我还没有深入到源代码中去挖掘。我可以想象,如果你一次提供了太多记录,那么该库内部可能会调用一些阻塞IO操作。 - al-bex
@al-bex 是的,有时候我在使用NextRecord的异步版本时会遇到InvalidOperationException: The stream is currently in use by a previous operation on the stream.的问题。 - Mark Good

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接