我正在编写一种方法,该方法将单独的文本行异步写入文件。如果它是cancelled,它将删除创建的文件并跳出循环。
这是简化的代码,可以正常工作。。。我标记了2点,我不确定它们是如何处理的。我希望代码在任何情况下都不会阻塞线程。
public async Task<IErrorResult> WriteToFileAsync(string filePath,
CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
using var stream = new FileStream(filePath, FileMode.Create);
using var writer = new StreamWriter(stream, Encoding.UTF8);
foreach (var line in Lines)
{
if (cancellationToken.IsCancellationRequested)
{
//
// [1] close, delete and throw if cancelled
//
writer.Close();
stream.Close();
if (File.Exists(filePath))
File.Delete(filePath);
throw new OperationCanceledException();
}
// write to the stream
await writer.WriteLineAsync(line.ToString());
}
//
// [2] flush and let them dispose
//
await writer.FlushAsync();
await stream.FlushAsync();
// await stream.DisposeAsync();
return null;
}
我正在Close()
和FileStream
上调用StreamWriter
,我认为它将同步运行并阻塞线程。我该如何改善?我不想等待它将缓冲区刷新到文件中然后删除文件。
我想在Dispose
范围的末尾将调用DisposeAsync
方法,而不是using
。 (此假设正确吗?。)>
所以Dispose
阻塞了线程,并且为了防止我先用FlushAsync
进行刷新,以便Dispose
将执行less
我也可以删除using
,而我可以在这两个地方手动编写DisposeAsync
。但这会降低可读性。
如果我用FileStream
打开useAsync = true
,在DisposeAsync
块结束时会自动调用using
吗?
对上述代码的任何解释或变种,都能得到更好的表现。
我正在编写一种方法,该方法将单独的文本行异步写入文件。如果取消,它将删除创建的文件并跳出循环。这是有效的简化代码...
如您所愿,using
语句将调用Dispose()
,而不是DisposeAsync()
。