问题详情
Program.cs 中下面的代码
app.Lifetime.ApplicationStopping.Register(async () =>
{
await app.Services.GetRequiredService<IRedisDatabase>().RemoveAsync(blogPostCacheKey);
await app.Services.GetRequiredService<IRedisClientFactory>()
.GetRedisClient("redis-postbody")
.GetDbFromConfiguration()
.RemoveAsync(postBodyCacheKey);
});
在运行时会报错,错误信息如下
The active test run was aborted. Reason: Test host process crashed : Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'IServiceProvider'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowObjectDisposedException()
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
请问如何解决这个问题?
回答
app.Lifetime.ApplicationStopping.Register(async () 不要异步. 它接受的是一个action. 内部callback 这个action的时候不会判断是不是返回了Task, 要不要await.
app.Lifetime.ApplicationStopping.Register( ()=>{
….RemoveAsync().GetAwaiter().GetResult(); 差不多这样子.
})
或者
await app.RunAsync()
// cleanup
await app.Service…..RemoveAsync(); 这样也行. 只要app没有dispose, 就都能用.
版权:言论仅代表个人观点,不代表官方立场。转载请注明出处:https://www.stntk.com/question/218.html
还没有评论呢,快来抢沙发~