diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index 449a6f32..f2913f53 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -4,6 +4,7 @@ using System.Collections.Concurrent; using System.Linq; using System.Reflection; using System.Threading.Tasks; +using System.Threading; namespace FreeSql { @@ -200,11 +201,10 @@ namespace FreeSql #endregion ~DbContext() => this.Dispose(); - bool _isdisposed = false; + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; - _isdisposed = true; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; try { _actions.Clear(); diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index 6150feb4..fc31b1a8 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -7,6 +7,7 @@ using System.Collections.Concurrent; using System.Linq; using System.Linq.Expressions; using System.Reflection; +using System.Threading; namespace FreeSql { @@ -36,11 +37,10 @@ namespace FreeSql } ~DbSet() => this.Dispose(); - bool _isdisposed = false; + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; - _isdisposed = true; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; try { this._dicUpdateTimes.Clear(); diff --git a/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs b/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs index b03874bd..c0e578ff 100644 --- a/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs +++ b/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs @@ -144,10 +144,7 @@ namespace FreeSql return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled : false; } - ~DataFilter() - { - this.Dispose(); - } + ~DataFilter() => this.Dispose(); public void Dispose() { _filters.Clear(); @@ -169,10 +166,7 @@ namespace FreeSql return this; } - ~FluentDataFilter() - { - this.Dispose(); - } + ~FluentDataFilter() => this.Dispose(); public void Dispose() { _filters.Clear(); diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 723b545e..80145899 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Threading; using System.Threading.Tasks; namespace FreeSql @@ -42,11 +43,10 @@ namespace FreeSql } ~BaseRepository() => this.Dispose(); - bool _isdisposed = false; + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; - _isdisposed = true; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; try { _dbsetPriv?.Dispose(); diff --git a/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs b/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs index 8aeb4d6f..892d5e74 100644 --- a/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs +++ b/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs @@ -105,18 +105,20 @@ namespace FreeSql public DbContext.EntityChangeReport EntityChangeReport { get; } = new DbContext.EntityChangeReport(); - ~UnitOfWork() - { - this.Dispose(); - } - bool _isdisposed = false; + ~UnitOfWork() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; - _isdisposed = true; - this.Rollback(); - this.Close(); - GC.SuppressFinalize(this); + if (Interlocked.Increment(ref _disposeCounter) != 1) return; + try + { + this.Rollback(); + this.Close(); + } + finally + { + GC.SuppressFinalize(this); + } } } } diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs index 9fb1b7c2..a2b807dd 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs @@ -120,14 +120,11 @@ namespace FreeSql.Internal.CommonProvider } } - ~AdoProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~AdoProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; try { Transaction2[] trans = null; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 47687449..44a32fc2 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider @@ -38,11 +39,10 @@ namespace FreeSql.Internal.CommonProvider protected List _whereCascadeExpression = new List(); protected List _whereGlobalFilter; - bool _isDisponse = false; + int _disposeCounter; ~Select0Provider() { - if (_isDisponse) return; - _isDisponse = false; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; _where.Clear(); _params.Clear(); _tables.Clear(); diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs index 1ce3cf0b..b5f2dd8d 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Linq.Expressions; +using System.Threading; namespace FreeSql.MySql { @@ -73,14 +74,11 @@ namespace FreeSql.MySql public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~MySqlProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~MySqlProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs index a0c38cd9..cac216c5 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs @@ -1,10 +1,11 @@ using FreeSql.Internal; using FreeSql.Internal.CommonProvider; -using System; -using System.Collections.Generic; -using System.Collections.Concurrent; -using System.Linq; using FreeSql.Odbc.Default; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; namespace FreeSql.Odbc.Default { @@ -86,14 +87,11 @@ namespace FreeSql.Odbc.Default public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~OdbcProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~OdbcProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; try { (this.Ado as AdoProvider)?.Dispose(); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs index d1fa229f..f779a505 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Linq.Expressions; +using System.Threading; namespace FreeSql.Odbc.MySql { @@ -51,14 +52,11 @@ namespace FreeSql.Odbc.MySql public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~OdbcMySqlProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~OdbcMySqlProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs index 974bf391..9191ce78 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs @@ -3,6 +3,7 @@ using FreeSql.Internal.CommonProvider; using System; using System.Collections.Generic; using System.Data.Common; +using System.Threading; namespace FreeSql.Odbc.Oracle { @@ -52,14 +53,11 @@ namespace FreeSql.Odbc.Oracle public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~OdbcOracleProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~OdbcOracleProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs index 26da3b6d..8358e646 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs @@ -2,6 +2,7 @@ using FreeSql.Internal.CommonProvider; using System; using System.Collections.Generic; +using System.Threading; namespace FreeSql.Odbc.PostgreSQL { @@ -49,14 +50,11 @@ namespace FreeSql.Odbc.PostgreSQL public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~OdbcPostgreSQLProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~OdbcPostgreSQLProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs index a13e4e67..8af1881a 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs @@ -2,6 +2,7 @@ using FreeSql.Internal.CommonProvider; using System; using System.Collections.Generic; +using System.Threading; namespace FreeSql.Odbc.SqlServer { @@ -57,14 +58,11 @@ namespace FreeSql.Odbc.SqlServer public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~OdbcSqlServerProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~OdbcSqlServerProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs index 6f938cf6..dfed6ce9 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs @@ -4,6 +4,7 @@ using FreeSql.Oracle.Curd; using System; using System.Collections.Generic; using System.Data.Common; +using System.Threading; namespace FreeSql.Oracle { @@ -47,14 +48,11 @@ namespace FreeSql.Oracle public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~OracleProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~OracleProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs index 50f25473..550e9284 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs @@ -11,6 +11,7 @@ using System.Data.Common; using System.Linq.Expressions; using System.Net; using System.Net.NetworkInformation; +using System.Threading; namespace FreeSql.PostgreSQL { @@ -100,14 +101,11 @@ namespace FreeSql.PostgreSQL public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~PostgreSQLProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~PostgreSQLProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs index b9de151e..d5d87938 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs @@ -3,6 +3,7 @@ using FreeSql.Internal.CommonProvider; using FreeSql.SqlServer.Curd; using System; using System.Collections.Generic; +using System.Threading; namespace FreeSql.SqlServer { @@ -58,14 +59,11 @@ namespace FreeSql.SqlServer public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~SqlServerProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~SqlServerProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs index 9a8b665d..5c17d9f9 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs @@ -4,6 +4,7 @@ using FreeSql.Sqlite.Curd; using System; using System.Collections.Generic; using System.Data.Common; +using System.Threading; namespace FreeSql.Sqlite { @@ -46,14 +47,11 @@ namespace FreeSql.Sqlite public GlobalFilter GlobalFilter { get; } = new GlobalFilter(); - ~SqliteProvider() - { - this.Dispose(); - } - bool _isdisposed = false; + ~SqliteProvider() => this.Dispose(); + int _disposeCounter; public void Dispose() { - if (_isdisposed) return; + if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } }