我有以下同步代码,它可以正常工作:
private void GenerateExportOutput()
{
using StreamWriter writer = new(Coordinator.OutputDirectory + @"\export.txt");
if (this.WikiPagesToExport.IsEmpty)
{
return;
}
var wanted = new SortedDictionary<string, WikiPage>(this.WikiPagesToExport, StringComparer.Ordinal);
foreach (var title in wanted.Keys)
{
writer.WriteLine(title);
}
}
我想将其更改为异步。因此:
private async Task GenerateExportOutputAsync()
{
using StreamWriter writer = new(Coordinator.OutputDirectory + @"\export.txt");
if (this.WikiPagesToExport.IsEmpty)
{
return;
}
var wanted = new SortedDictionary<string, WikiPage>(this.WikiPagesToExport, StringComparer.Ordinal);
foreach (var title in wanted.Keys)
{
await writer.WriteLineAsync(title).ConfigureAwait(false);
}
await writer.FlushAsync().ConfigureAwait(false);
}
代码可编译通过。但我使用的分析器之一 (Meziantou.Analyzer) 建议我“更喜欢使用 'await using'”。虽然以前尝试过几次,总是遇到同样的问题,但我仍想使用它,所以:
await using StreamWriter writer = new StreamWriter(OutputDirectory + @"\export.txt").ConfigureAwait(false);
现在它不能再编译:CS0029 无法将类型 'System.Runtime.CompilerServices.ConfiguredAsyncDisposable' 隐式转换为 'System.IO.StreamWriter'
。好的,那么我使用 var
进行修改:
await using var writer = new StreamWriter(OutputDirectory + @"\export.txt").ConfigureAwait(false);
这样可以避免CS0029错误,但后面的代码现在无法编译:Error CS1061“ConfiguredAsyncDisposable”不包含“WriteLineAsync”的定义
(FlushAsync
也有类似的错误)。那怎么办呢?也许需要进行强制转换?
await ((StreamWriter)writer).WriteLineAsync(title).ConfigureAwait(false);
错误: Error CS0030 无法将类型“System.Runtime.CompilerServices.ConfiguredAsyncDisposable”转换为类型“System.IO.StreamWriter”
我已经通过搜索和阅读了大量的材料,无论是现在还是过去几次,但我仍然完全不知道如何使用“await using”。我该如何做?谢谢。
using var writer = new StreamWriter("...");
then on the next line:await writer.WriteLineAsync().ConfigureAwait(false);
- CharlesIAsyncDisposable.Dispose
方法,而是使用IDisposable.Dispose
方法。 - madreflectionConfigureAwait(false)
,这是这个问题的关键。我链接的页面展示了在将某些东西分配给_variable_
之后使用await using (_variable_.ConfigureAwait(false))
。该变量具有正确的类型,而单独使用await using
则捕获用于异步处理的配置等待对象。 - madreflection