信息系统常用数据库连接。多库的话就开启多个线程连接多库分别查询。
有这样一个需求。 我要终止上一组多库查询线程。这些线程可能都没有执行完。有的在连接数据库,有的再获取数据。
此时常会发现,主线程一直停在th.Join方法里面。 也就是你没有能完全终止或者停掉你要停止的线程。
这是因为。.net中为了维护线程安全。保证一些非托管资源能得到及时释放。需要在代码执行到安全的点上。才真正终止线程(在内部引发异常的方式退出)。 因为连接数据库网络或IO资源。这些其实都是对非托管资源的包装。 如果数据库正连接和查询。 线程还没有回到安全的托管代码段中。该线程就被设计成,暂时不能立即停止它。
此时要杀掉该线程。有一个方法:取得该线程中数据库连接DbCommand和DbConnection对象。先执行DbCommand.Cancel().取消查询命令,然后DbConnection.Close()关闭数据库连接。 此时线程内部,可能会引起一些异常,并使代码跳到异常处理程序等一些安全点上。这时候再执行如上代码。就可以停掉该线程了