C# 此MySqlConnection已在使用中

C# 此MySqlConnection已在使用中,c#,aspnetboilerplate,C#,Aspnetboilerplate,我使用Hangfire创建了一个RecurringJob,但当该作业完成时,我得到以下错误: ERROR 2018-12-05 15:20:05,982 [fc937] Hangfire.AutomaticRetryAttribute - Failed to process the job '81': an exception occurred. System.InvalidOperationException: This MySqlConnection is already in use.

我使用Hangfire创建了一个RecurringJob,但当该作业完成时,我得到以下错误:

ERROR 2018-12-05 15:20:05,982 [fc937] Hangfire.AutomaticRetryAttribute - Failed to process the job '81': an exception occurred.
System.InvalidOperationException: This MySqlConnection is already in use.   See https://fl.vu/mysql-conn-reuse
at MySqlConnector.Core.ServerSession.StartQuerying(MySqlCommand command) in    C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 149
at MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync(String commandText, MySqlParameterCollection parameterCollection, CommandBehavior  behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs:line 33
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 261
at MySql.Data.MySqlClient.MySqlTransaction.CommitAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlTransaction.cs:line 25
at MySql.Data.MySqlClient.MySqlTransaction.Commit() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlTransaction.cs:line 12
at Microsoft.EntityFrameworkCore.Storage.RelationalTransaction.Commit()
at Abp.EntityFrameworkCore.Uow.DbContextEfCoreTransactionStrategy.Commit() in D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\DbContextEfCoreTransactionStrategy.cs:line 66
at Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.CommitTransaction() in D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\EfCoreUnitOfWork.cs:line 92
at Abp.Domain.Uow.UnitOfWorkBase.Complete() in D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkBase.cs:line 256
at Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation invocation, UnitOfWorkOptions options) in D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:line 68
at Castle.DynamicProxy.AbstractInvocation.Proceed()
代码如下所示:

public class TestJob : ITransientDependency
{
    private readonly IDapperRepository<Customer> _customerDapperRepository;
    private readonly IRepository<Customer> _customerRepository;
    private readonly IRepository<User, long> _userRepository;
    public TestJob(...)
    {
     ...
    }
    [UnitOfWork]
    [AutomaticRetry(Attempts = 0)]
    public virtual void ExecuteJob()
    {
       var someCustomerList = GetSomeCustomerList();
       foreach (var customer in someCustomerList )
       {
          //do some db operations
       }
    }
    private List<Customer> GetSomeCustomerList()
    {
       //get some Customer with conditions
    }
}
公共类测试作业:ITransientDependency
{
专用只读IDapperRepository_customerDapperRepository;
私人只读电子存储库(customerRepository);;
私有只读IRepository用户存储库;
公共测试作业(…)
{
...
}
[工作单元]
[自动重试(尝试次数=0)]
公共虚拟void ExecuteJob()
{
var someCustomerList=GetSomeCustomerList();
foreach(someCustomerList中的var客户)
{
//做一些数据库操作
}
}
私有列表GetSomeCustomerList()
{
//找一些有条件的客户
}
}

上面的代码在调试过程中没有报告错误,我不知道哪里出了问题。

如果您像我一样使用异步编程,请确保在您的流程中,您没有使用异步任务执行到DB的往返,也没有使用任务执行到DB的新异步往返,当我注意到并更改代码时,虽然我不完全清楚发生了什么,但请考虑以下事项:

  • 每次使用时关闭连接
  • 考虑在一个范围内执行所有数据库操作。这样,每次查询数据库时,连接实例都会被正确地处理,而不必费心关闭它

嘿,这个问题解决了吗?