【问题标题】: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");

【问题讨论】:

    标签: multithreading abort


    【解决方案1】:

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

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

    【讨论】:

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