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

    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相关问答推荐

是否存在指定的(子)索引分隔符?

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

如何在 WPF 中创建/制作圆角按钮?

将双精度转换为带有 N 个小数的字符串,点作为小数分隔符,并且没有千位分隔符

C# 中基于接口编程的运算符重载

如何结合 ||条件语句中的运算符

静态析构函数

.NET 反射的成本是多少?

关闭 Visual Studio 中所有选项卡但当前选项卡的键盘快捷键?

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

如何在 C# 中将 null 值设置为 int?

Visual Studio 类图不显示关系

.NET 高级别的 .NET 4.0 和 .NET 4.5 的区别

读取 XML(从字符串)并获取一些字段 - 读取 XML 时出现问题

ValueTypes 如何从 Object (ReferenceType) 派生并且仍然是 ValueTypes?

判断任意字符串是否为有效文件名的最简单方法

在 C# 中转义无效的 XML 字符

在 C#/.NET 中合并两个图像

如何将两个 List 相互比较?

Linq Query 不断抛出无法创建 System.Object 类型的常量值......,为什么?