C#SQLite数据库锁定异常

C#SQLite数据库锁定异常,c#,multithreading,sqlite,C#,Multithreading,Sqlite,我正在尝试使用SaveChangesSync方法将数据保存到数据库中, 首先,用户正在登录(用户的isOnline bool属性为true,并将更改保存到数据库) 但是当我注销时,我使用完全相同的方法(isOnline设置为false),然后在savechangessync-SQLiteException弹出, 我查看了异常信息,它说数据库不知怎么被锁定了 public readonly ProjectDbContext _projectDbContext; public U

我正在尝试使用SaveChangesSync方法将数据保存到数据库中, 首先,用户正在登录(用户的isOnline bool属性为true,并将更改保存到数据库) 但是当我注销时,我使用完全相同的方法(isOnline设置为false),然后在savechangessync-SQLiteException弹出, 我查看了异常信息,它说数据库不知怎么被锁定了

  public readonly ProjectDbContext _projectDbContext;
        public UserRepository(ProjectDbContext projectDbContext)
        {
            _projectDbContext = projectDbContext;
        }

   public async Task<User> Logout(User user)
        {
            var userList = _projectDbContext.Users.ToList();

            foreach (var userX in userList)
            {
                if (userX.Id == user.Id)
                {
                    userX.IsOnline = false;
                    try
                    {
                        await _projectDbContext.SaveChangesAsync();
                    }
                    catch (SqliteException e)
                    {
                        var str = e.Data;
                        return userX;
                    }

                    return userX;
                }
            }

            return null;
        }

        public async Task<User> GetUserAsync(User user)
        {
            var userList = _projectDbContext.Users.ToList();

            foreach (var userX in userList)
            {
                if (userX.UserName == user.UserName && userX.Password == await HashMD5(user.Password))
                {
                    userX.IsOnline = true;
                    await _projectDbContext.SaveChangesAsync();

                    return userX;
                }
            }

            return null;         
        }

发布完整的异常消息会很有用。多个线程/进程可以访问数据库吗?如果是这样,您将需要设置(通常值为
5000
10000
)。这将有助于发布完整的异常消息。多个线程/进程是否可以访问数据库?如果是这样,您将需要设置(通常值为
5000
10000
)。
{Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 5: 'database is locked'.
   at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
   at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
   at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
   at Microsoft.Data.Sqlite.SqliteConnectionExtensions.ExecuteNonQuery(SqliteConnection connection, String commandText)
   at Microsoft.Data.Sqlite.SqliteTransaction..ctor(SqliteConnection connection, IsolationLevel isolationLevel)
   at Microsoft.Data.Sqlite.SqliteConnection.BeginTransaction(IsolationLevel isolationLevel)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionWithNoPreconditions(IsolationLevel isolationLevel)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionAsync(CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(DbContext _, ValueTuple`2 parameters, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IReadOnlyList`1 entriesToSave, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at ServerSideAngularProject.DAL.UserRepository.Logout(User user) in C:\Users\osher\source\repos\ServerSideAngularProject\ServerSideAngularProject\DAL\UserRepository.cs:line 33}