在C#流上使用DisposeAsync的正确方法

问题描述 投票:1回答:1

我正在编写一种方法,该方法将单独的文本行异步写入文件。如果它是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;
}

1

我正在Close()FileStream上调用StreamWriter,我认为它将同步运行并阻塞线程。我该如何改善?我不想等待它将缓冲区刷新到文件中然后删除文件。

2

我想在Dispose范围的末尾将调用DisposeAsync方法,而不是using。 (此假设正确吗?。)>

所以Dispose阻塞了线程,并且为了防止我先用FlushAsync进行刷新,以便Dispose将执行less

事情。 (这在多大程度上是正确的?

我也可以删除using,而我可以在这两个地方手动编写DisposeAsync。但这会降低可读性。

如果我用FileStream打开useAsync = true,在DisposeAsync块结束时会自动调用using吗?


对上述代码的任何解释或变种,都能得到更好的表现。

我正在编写一种方法,该方法将单独的文本行异步写入文件。如果取消,它将删除创建的文件并跳出循环。这是有效的简化代码...

c# asynchronous stream
1个回答
0
投票

如您所愿,using语句将调用Dispose(),而不是DisposeAsync()

© www.soinside.com 2019 - 2024. All rights reserved.