我的文件由于线程而被锁定,即使中止它也没有被终止

Posted

技术标签:

【中文标题】我的文件由于线程而被锁定,即使中止它也没有被终止【英文标题】:My file that has been locked because of a thread and it is not being terminated by even after aborting it 【发布时间】:2019-10-23 16:30:55 【问题描述】:

我试图中止线程并删除一个文件,但该文件仍然给我消息说它被另一个进程使用。中止线程后,它继续通过 catch 块,我在 Microsoft 中看到一个文档说如果执行 reset.Abort 避免它进入每个 catch 块的末尾,中止过程将被取消,这意味着文件仍然会有一个正在使用它的进程。有没有办法在关闭应用程序并删除文件之前中止我的线程? if(!task.IsCompleted)

                    Thread t1 = Thread.CurrentThread;

                    if (Thread.CurrentThread.Name == null)
                    
                        Thread.CurrentThread.Name = "Action_Thread";
                    

                    try
                    
                        t1.Abort("Aborted");
                    
                    catch(ThreadAbortException ex)
                    
                        Debug.WriteLine(ex.Message);
                    
                    finally
                    
                        Debug.WriteLine("Thread now being aborted");
                    
               File.Delete("somefile.txt");

【问题讨论】:

【参考方案1】:

大多数平台仅在进程退出时自动关闭文件句柄,而不是单个线程,因此您必须在中止线程之前关闭或解锁文件(或其句柄)。

这将如何完成,以及是否可以在线程中止时自动完成或需要中止逻辑显式调用关闭操作,取决于您使用的平台或语言环境。

【讨论】:

我正在使用 c# 并在 windows 上运行。 @SarbeshBaskota 不要使用 thread.Abort,因为它不会释放托管资源。发送消息或设置线程检查的 volatile 标志,以便它可以正常退出。 我不知道这个过程是如何完成的,到目前为止,中止线程和删除文件的过程都在上面添加了描述。 @SarbeshBaskota 没有理由使用 thread.Abort() 中止当前线程。只需从线程的 run 方法返回或抛出异常。 我想要做的是,如果进程卡在某些操作中,在我的情况下,我只想删除该线程并获取该操作所释放的文件,即我试图中止线程的原因。你有什么建议吗?

以上是关于我的文件由于线程而被锁定,即使中止它也没有被终止的主要内容,如果未能解决你的问题,请参考以下文章

POSIX 部分写入、线程安全和锁定

为啥互斥锁没有被锁定

异常进程终止时的资源清理

unix 中的线程调度

当锁定不可用时,调用Lock.lock()的线程何时从调用返回?

线程在完成执行代码之前在动态库中中止