我有一些使用 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/