C# SQL连接在线程中止时隐式关闭

C# SQL连接在线程中止时隐式关闭,c#,.net,multithreading,C#,.net,Multithreading,我正在打开SQL连接,然后在其中运行许多SQL脚本。我的程序在任何位置都不会关闭连接,但如果调用Thread.Abort(),则连接有时会关闭(50/50) 代码如下所示: connection.Open(); try { // running various SQL script, no one is closing connection // calling Thread.Abort() at this point } catch (ThreadAbortException ex)

我正在打开SQL连接,然后在其中运行许多SQL脚本。我的程序在任何位置都不会关闭连接,但如果调用Thread.Abort(),则连接有时会关闭(50/50)

代码如下所示:

connection.Open();
try
{
  // running various SQL script, no one is closing connection
  // calling Thread.Abort() at this point
}
catch (ThreadAbortException ex)
{
  Thread.ResetAbort();
  // connection sometimes has state "Closed" here!!!
  new SqlCommand("blahblah", connection).ExecuteNonQuery(); // doesn't work then
}
为什么会这样?在我明确关闭它之前,我应该如何使它保持活动状态? 这是连接关闭时的调用堆栈:

   at SNIReadSyncOverAsync(SNI_ConnWrapper* , SNI_Packet** , Int32 )
   at SNINativeMethodWrapper.SNIReadSyncOverAsync(SafeHandle pConn, IntPtr& packet, Int32 timeout)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
   at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader()

试图中止一个线程是不不的,为什么你想用CLR向导ErrIPPrt的明智的话来做这样的恶作剧?“总之,Bult。中止是最好的指示坏的设计,可能不可靠,极其危险。它应该不惜一切代价避免;你甚至应该考虑中止一个线程的时间是在某种程度上的。”紧急关闭“您试图尽可能干净地拆除appdomain的代码”也会因为您的名称而进行升级表决。连接变量是否在同一线程上活动?请不要调用
thread.Abort()
。即使您处理了任何异常,它仍然会破坏运行时,这意味着其余线程可能无法正常工作。它只应在强制关闭应用程序时使用。