Tag: 线程线程中止

线程中止离开僵尸事务并破坏SqlConnection

我觉得这种行为不应该发生。 这是场景: 启动一个长期运行的SQL事务。 运行sql命令的线程被中止(不是我们的代码!) 当线程返回托管代码时,SqlConnection的状态为“已关闭” – 但该事务仍在sql server上打开。 SQLConnection可以重新打开,你可以尝试在事务上调用回滚,但它没有效果(不是我期望这种行为。重点是没有办法访问数据库上的事务并滚动它背部。) 问题只是在线程中止时没有正确清理事务。 这是.Net 1.1,2.0和2.0 SP1的问题。 我们正在运行.Net 3.5 SP1。 这是一个说明问题的示例程序。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Threading; namespace ConsoleApplication1 { class Run { static Thread transactionThread; public class ConnectionHolder : IDisposable { public void Dispose() { } public void executeLongTransaction() { Console.WriteLine(“Starting a […]

Thread.Abort()如何工作?

当无效输入传递给方法或对象即将进入无效状态时,我们通常抛出exception。 让我们考虑以下示例 private void SomeMethod(string value) { if(value == null) throw new ArgumentNullException(“value”); //Method logic goes here } 在上面的例子中,我插入了一个抛出ArgumentNullException的throw语句。 我的问题是运行时如何设置抛出ThreadAbortException 。 显然,在所有方法中都不可能使用throw语句,即使运行时也设法在我们的自定义方法中抛出ThreadAbortException 。 我想知道他们是怎么做到的? 我很想知道幕后发生了什么,我打开一个reflection器来打开Thread.Abort并最终得到这个 [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern void AbortInternal();//Implemented in CLR 然后我用Google搜索并发现了ThreadAbortException如何真正起作用 。 这个链接说运行时通过QueueUserAPC函数发布APC,这就是他们如何做到这一点。 我不知道QueueUserAPC方法我只是试着看看是否可以使用一些代码。 以下代码显示了我的尝试。 [DllImport(“kernel32.dll”)] static extern uint QueueUserAPC(ApcDelegate pfnAPC, IntPtr hThread, UIntPtr dwData); delegate void ApcDelegate(UIntPtr dwParam); Thread t = new […]

由于AcceptSocket,Thread.Abort似乎没有抛出ThreadAbortException

我在下面的线程上调用ChannelServer.ListeningThread.Abort ,但似乎没有任何事情发生。 我想更具体一点,但我想不出更多。 似乎没有抛出ThreadAbortException ,并且无论阻塞侦听器如何都应抛出此exception(它在阻塞接收的线程上完美运行)。 重要编辑 :使用ManualResetEvent.WaitOne而不是AcceptSocket ,正如Lyrik建议进行测试一样,它完美无缺。 为什么AcceptSocket阻止ThreadAbortException ? 链接 :这个论坛主题似乎讨论了同样的问题,虽然我无法解决任何问题: http : //www.tek-tips.com/viewthread.cfm?qid = 319436&page = 413 ChannelServer.ListeningThread = new Thread(new ThreadStart(delegate() { Log.Inform(“Waiting for clients on thread {0}.”, Thread.CurrentThread.ManagedThreadId); while (true) { try { new Thread(new ParameterizedThreadStart(ChannelClientHandler.Initialize)).Start(ChannelServer.Listener.AcceptSocket()); } catch (ThreadAbortException) { Log.Inform(“Aborted client listening thread {0}.”, Thread.CurrentThread.ManagedThreadId); break; } } })); ChannelServer.ListeningThread.Start();