c# - C#中如何处理异步方法和IDisposable?

标签 c# asp.net-core .net-core async-await xunit

我有一些使用 xUnit 的集成测试需要拆除在测试期间创建的一些资源。为此,我在包含测试的类中实现了 IDisposable

问题是我需要删除在测试期间使用只有异步接口(interface)的客户端创建的资源。但是,Dispose 方法是同步的。

我可以使用 .Result.Wait() 来等待异步调用的完成,但这可能会造成死锁(这个问题有详细记录 here ).

鉴于我不能使用 .Result.Wait(),在 Dispose< 中调用异步方法的正确(和安全)方法是什么 方法?

更新:添加一个(简化的)示例来说明问题。

[Collection("IntegrationTests")]
public class SomeIntegrationTests : IDisposable {
    private readonly IClient _client; // SDK client for external API

    public SomeIntegrationTests() {
        // initialize client
    }

    [Fact]
    public async Task Test1() {
        await _client
            .ExecuteAsync(/* a request that creates resources */);

        // some assertions
    }

    public void Dispose() {
        _client
            .ExecuteAsync(/* a request to delete previously created resources */)
            .Wait(); // this may create a deadlock
    }
}

最佳答案

事实证明,xunit 实际上包括一些支持来处理我面临的问题。测试类可以实现 IAsyncLifetime以异步方式初始化和拆除测试。界面看起来像:

public interface IAsyncLifetime
{
    Task InitializeAsync();
    Task DisposeAsync();
}

虽然这是我的特定问题的解决方案,但它没有解决从 Dispose 调用异步方法的更一般的问题(当前的答案也没有这样做)。我想我们需要等到 IAsyncDisposable在 .NET 核心 3.0 中可用(感谢@MartinUllrich 提供此信息)。

关于c# - C#中如何处理异步方法和IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56389546/

相关文章:

c# - 在没有 IOptions<T> 的情况下读取和使用 appsettings.json 中的设置?

c# - 如何在 Linux 上安装特定版本的 nuget (2.12)?

c# - 将事件GotFocus分配给WPF应用程序中的所有文本框

c# - 如何确保路径中有尾随目录分隔符?

c# - 如何使用 .net 核心默认服务容器注册特定接口(interface)的所有类

c# - EntityFramework Core Database First 不会以流畅方式生成主键

javascript - 仅刷新 ASP.NET CORE Razor 页面中的内容页面

C# ILogger依赖注入(inject)错误: There is no argument

C# 删除 Azure Blob - 无效的 Uri

c# - 是否有更优雅的形式将 NULL 分配给 InsertCommand 的 NVarChar?