我有一些使用xUnit的集成测试需要在测试期间删除一些资源。为此,我已经在包含测试的类中实现了
问题是,我需要使用仅具有异步接口的客户端来删除测试期间创建的资源。但是,
我可以使用
鉴于我不能使用
更新:添加(简化的)示例以显示问题。
IDisposable
。问题是,我需要使用仅具有异步接口的客户端来删除测试期间创建的资源。但是,
Dispose
方法是同步的。我可以使用
.Result
或.Wait()
等待异步调用的完成,但这可能会创建死锁(该问题在此处有详细记录)。鉴于我不能使用
.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
}
}
.GetAwaiter().GetResult()
这样的东西时遇到了问题,还是只是想要预防问题?如果你不是在同步上下文(UI应用程序..)中运行,那么情况并不会太糟糕。如果你不需要“等待”处理,你也可以触发异步执行而不必等待它完成 - 例如async void
- 只需确保通过添加try/catch来避免引起未处理的异常。 - Martin UllrichIAsyncDisposable
。 - Martin Ullrich