使用 DbContextOptionsBuilder 的 ConfigureAwait(false) 配置来避免出现问题。这样可以确保在每个线程中都有自己的 DbContext 实例,并且不会出现资源争夺的情况。示例代码如下:
public class MyHandler : DelegatingHandler
{
private readonly DbContextOptionsBuilder optionsBuilder;
public MyHandler(DbContextOptionsBuilder optionsBuilder)
{
this.optionsBuilder = optionsBuilder;
}
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
using (var context = new MyDbContext(optionsBuilder.Options))
{
// ...
await context.SaveChangesAsync().ConfigureAwait(false);
}
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
在上面的代码中,DbContextOptionsBuilder 通过构造函数注入,并在 SendAsync 方法中使用。通过使用 ConfigureAwait(false),可以确保在每个线程中都有自己的 DbContext 实例。