我有以下同步代码,运行良好:

    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)建议我"更喜欢使用‘等待使用’".我从未使用过等待使用(尽管我过go try 过几次,总是遇到与现在相同的问题).但我想用它,所以:

        await using StreamWriter writer = new StreamWriter(OutputDirectory + @"\export.txt").ConfigureAwait(false);

现在它不再编译:CS0029 Cannot implicitly convert type 'System.Runtime.CompilerServices.ConfiguredAsyncDisposable' to 'System.IO.StreamWriter'.好吧,我把它改成var:

        await using var writer = new StreamWriter(OutputDirectory + @"\export.txt").ConfigureAwait(false);

这使得它通过了CS0029,但现在后面的代码没有编译:Error CS1061 'ConfiguredAsyncDisposable' does not contain a definition for 'WriteLineAsync'(和FlushAsync.Soooo类似的代码…可能会强制转换它?

            await ((StreamWriter)writer).WriteLineAsync(title).ConfigureAwait(false);

不:Error CS0030 Cannot convert type 'System.Runtime.CompilerServices.ConfiguredAsyncDisposable' to 'System.IO.StreamWriter'

我已经在谷歌上搜索了一堆,读了一堆,现在和过go 都是如此,但我完全不知道如何使用这个"等待使用"的东西.我该怎么做?谢谢

推荐答案

关于其对配置IAsyncDisposable的等待的支持,目前的await using语法(C# 10)还有很多需要改进的地方.我们最多只能这样做:

private async Task GenerateExportOutputAsync()
{
    StreamWriter writer = new(Coordinator.OutputDirectory + @"\export.txt");
    await using (writer.ConfigureAwait(false))
    {
        //...
    }
}

.这并不比根本不使用await using语法紧凑得多:

private async Task GenerateExportOutputAsync()
{
    StreamWriter writer = new(Coordinator.OutputDirectory + @"\export.txt");
    try
    {
        //...
    }
    finally { await writer.DisposeAsync().ConfigureAwait(false); }
}

与GitHub相关的问题:Using ConfigureAwait in "await using" declaration.

.net相关问答推荐

.NET最小API BadRequest响应不返回正文

.net Maui 在单击按钮时访问 CollectionView 中的数据项

如何为多种文件类型设置 FileSystemWatcher 过滤器?

将字符串与容差进行比较

将 Moq 模拟对象传递给构造函数

在一个 LINQ 查询中获取两列的总和

将 DataRowCollection 转换为 IEnumerable

使用 IIS Express 托管网站(临时)

托管和非托管代码、内存和大小有什么区别?

为什么 Interlocked.Exchange 不支持布尔类型?

C# 的浮点比较函数

如何在可取消的异步/等待中处理 TransactionScope?

.net 自定义配置如何不区分大小写解析枚举 ConfigurationProperty

迭代器和枚举器的区别

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

无法使用 Unity 将依赖项注入 ASP.NET Web API 控制器

嵌套的 Try/Catch 块是个坏主意吗?

如何从 HashSet 中检索实际项目?

如何为 Dapper 查询动态创建参数

SqlParameter 已被另一个 SqlParameterCollection 包含 - using() {} 作弊吗?