C# kill线程正常释放资源?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# kill线程正常释放资源?相关的知识,希望对你有一定的参考价值。

使用线程转码文件过程中,当超时时abort该线程,但是文件可能未释放,使用清理线程清理时出现文件进程占用问题,希望正常kill线程,解除占用,求解答

现使用abort之后等待线程结束1秒时间,但是貌似没有作用,还是会偶现文件占用问题

任何一个线程只要调用了exit都会导致进程结束,各种子线程当然也能很好的结束了,可是这种退出会有一个资源释放的问题.我们知道当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。没错,标准C++ IO流也会很好的在exit退出时得到flush并且释放资源,这些东西并不会造成资源的浪费(系统调用main函数入口类似于exit(main(argc,argv))).表面上似乎所有的问题都能随着进程的结束来得到很好的处理,其实并不然,我们程序从堆上分配的内存就不能得到很好的释放,如new ,delete后的存储空间,这些空间进程结束并不会帮你把这部分内存归还给内存.(本文初稿时,因基础不牢固,此处写错,事实上无论进程这样结束,系统都将会释放掉所有代码所申请的资源,无论是堆上的还是栈上的。(感谢ZKey的指导)。这种结束所有线程(包括主线程)的方式实际上在很多时候是非常可取的,但是对于针对关闭时进行一些别的逻辑的处理(指非资源释放逻辑)就不会很好,例如我想在程序被kill掉之前统计一下完成了多少的工作,这个统计类似于MapReduce,需要去每个线程获取,并且最后归并程一个统一的结果等等场景)追问

parameterizedThread线程终止没有exit方法,只有abort,但是abort不安全,使用文件资源一直不释放

参考技术A 兄弟你找到解决方法了嘛

oracle for update锁表资源释放之kill -9和alter system kill session 'sid,serial#';

通过for update锁表,通过操作系统方式和oracle方式终止进程方式

--查询需要终止进程的情况,包括操作系统进程

select proc.sPID,
sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo, dba_objects ao, v$session sess,v$process proc
where ao.object_id = lo.object_id
and lo.session_id = sess.sid
and sess.PADDR=proc.ADDR;

--通过操作系统方式终止进程

kill -9 spid

--通过oracle方式终止进程

alter system kill session ‘sid,serial#‘;











以上是关于C# kill线程正常释放资源?的主要内容,如果未能解决你的问题,请参考以下文章

C# 线程运行完之后自己会不会释放掉

C#嵌入dll到资源释放的问题

linux杀掉进程后进程中的堆资源会释放吗

C# Dispose模式

C# 资源释放问题

oracle for update锁表资源释放之kill -9和alter system kill session 'sid,serial#';