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

bet*_*ido 3 c# xunit async-await .net-core asp.net-core

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

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

我可以使用.Result.Wait()等待异步调用的完成,但这可能会造成死锁(该问题在此处有详细说明)。

鉴于我不能使用.Resultor .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
    }
}
Run Code Online (Sandbox Code Playgroud)

bet*_*ido 5

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

public interface IAsyncLifetime
{
    Task InitializeAsync();
    Task DisposeAsync();
}
Run Code Online (Sandbox Code Playgroud)

虽然这是我的具体问题的解决方案,但它并没有解决调用异步方法的更通用的问题Dispose(当前的答案也没有这样做)。我想为此我们需要等到IAsyncDisposable.NET core 3.0 可用(感谢 @MartinUllrich 提供此信息)。