C#解决文件被占用资源,无法删除或修改的方法_C#教程

复制代码 代码如下:

Thread parameterThread_t = null; 
private void Print_DetailForm_Shown(object sender, EventArgs e) 

 
    parameterThread_t = new Thread(new ParameterizedThreadStart(this.openThread_telnet)); 
    //parameterThread_t.IsBackground = false; 
    parameterThread_t.Start(null); 

 
/// <summary> 
/// 线程执行的方法,telnet获取数据 
/// </summary> 
private void openThread_telnet(Object obj) 

    //TelNet_Manage manage = new TelNet_Manage(); 
    try 
    { 
        manage.PrintBySockets(null, wy_name, table, progressBar1, label2); 
        String localPath = Environment.CurrentDirectory + @"\Ne_data\wy\" + wy_name; 
        if (MessageBox.Show(this,"数据打印完成!\n文件位置:" + localPath + "\n是否进入该目录?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) 
        { 
            System.Diagnostics.Process.Start(localPath); 
        } 
        this.Close(); 
        System.Threading.Thread.CurrentThread.Abort();//终止当前线程 
    } 
    catch(Exception e) 
    { 
        MessageBox.Show(this,"打印数据失败!","提示"); 
        System.Threading.Thread.CurrentThread.Abort();//终止当前线程   
        this.Close(); 
    } 
    System.Threading.Thread.CurrentThread.Abort();//终止当前线程   

 
private void button1_Click(object sender, EventArgs e) 

    //System.Threading.Thread.CurrentThread.Abort();//终止当前线程 
    if (parameterThread_t != null) 
    { 
        parameterThread_t.Interrupt(); 
        parameterThread_t.Abort(); 
        parameterThread_t.Join(); 
         
        GC.Collect(); 
    } 
    this.Close(); 
}

例子:在winform窗口在onshow事件中启动一个线程执行telnet程序。当点击中止按钮(button1_Click)中止线程再继续执行,并且释放当前线程占用的文件资源。

关键:parameterThread_t.Abort();parameterThread_t.Join(); GC.Collect();意思是,把线程Abort()停止线程执行,Join();线程挂起直到线程中止了,然后再GC回收资源。

时间: 2024-09-10 04:00:25

C#解决文件被占用资源,无法删除或修改的方法_C#教程的相关文章

C# 对文件与文件夹的操作包括删除、移动与复制_C#教程

在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类.文件夹(Folder)是只在Windows操作系统中使用的名词.在操作系统的理论中,人们更习惯于使用目录(Directory)这个名词.或许微软为了有朝一日将.Net移植到其他的操作系统中(实际上也有很多人也在做着这个项目),所以还是以Directory来命名操作文件夹的类. File类和Directory类都是静态类.使用它们的好处

在.NET中读取嵌入和使用资源文件的方法_C#教程

Dotnet中嵌入资源(位图.图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream.另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源. 下面分别详述这两种方法 一.使用GetManifestResourceStream读取嵌入资源 1.加入资源文件 直接把要嵌入到程序集的资源文件加入到项目中,可以加在项

FTPClientHelper辅助类 实现文件上传,目录操作,下载等操作_C#教程

文档说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 1.基本介绍 由于最近的项目是客户端的程序,需要将客户端的图片文件[切图]-[打包]-[ftp上传],现在就差最后一步了,慢慢的把这些小功能实现了,合并到一起就是一个大功能了,所以一个业务需要拆分的很小很小才可以看清楚,这个项目实际需要用到哪些知识点,下面介绍一下ftp上传的命令 ftp命令的参考链接:http://www.jb51.net/article/12199.htm ftp适合小文件上传 对带宽要求要求较高

C#集合遍历时删除和增加元素的方法_C#教程

本文实例讲述了C#集合遍历时删除和增加元素的方法.分享给大家供大家参考,具体如下: 大多数时候,遍历集合元素的时候并不需要对元素进行增加或者删除操作,但有些时候则需要,比如,如果集合中盛放的元素是社会上所有的人,那么有人死亡则元素删除,有人出生则是集合元素的增加.对于这种情况,遍历不能按照原来那种方式去做了,而且C#中的集合对于这类有增删动作的遍历,也不支持foreach循环. 有三种办法可以解决这一问题. 第一种方法:使用C#的LinkedList<>双链表.我原来设想,把原来链表需要删除的

C#设置自定义文件图标实现双击启动(修改注册表)_C#教程

程序生成的自定义文件,比如后缀是.test 这种文件怎么直接启动打开程序,并打开本文件呢      1.双击打开      2.自定义的文件,有图标显示      3.自定义的文件,点击右键有相应的属性 后台代码:(如何在注册表中修改信息) //工具启动路径 string toolPath = System.Windows.Forms.Application.StartupPath + "\\邮件小工具.exe"; string extension = SptdConst.FileEx

详解在C++中显式默认设置的函数和已删除的函数的方法_C 语言

在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数.已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型提升,这会导致意外的函数调用. 显式默认设置的函数和已删除函数的好处 在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数.复制构造函数.复制赋值运算符和析构函数.这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构.也就是说,可以创

System.Data.OleDb.OleDbException: 未指定的错误的完美解决方法_C#教程

异常详细信息: System.Data.OleDb.OleDbException: 未指定的错误 这个错误是access数据库特有的错误,当access频繁读取或操作过多的时候就会发生这个错误,微软官方已找不到具体的解决方法,网上搜索了很多,可以使用下面几种方法解决一下. 可能解决方法1: 重启服务器IIS,释放access连接,这种方法一般最有效,当然前提是自己有服务器控制权限,如果用虚拟主机的话主机商不太可能为一个网站重启iis,最好的方法就是转换为sql数据库. 可能解决方法2: 修改wi

在Form_Load里面调用Focus无效的解决方法_C#教程

因为觉得SplitContainer的虚线很丑,所以在程序启动的时候,想把焦点移到别的控件上去. 在Form_Load里面添加了 listview1.Focus(); 结果没效果.   查了查,找到了原因: 在调用Form_Load的时候,Form其实还没有进入展示阶段,自然Focus()调用也就没效果了.   解决方法: 在Focus()之前调用this.Show(); 或者更简单的,把Focus()函数调用移到Form_Shown事件处理中.

C#算法之大牛生小牛的问题高效解决方法_C#教程

问题: 一只刚出生的小牛,4年后生一只小牛,以后每年生一只.现有一只刚出生的小牛,问20年后共有牛多少只?思路: 这种子生孙,孙生子,子子孙孙的问题,循环里面还有循环的嵌套循环,一看就知道是第归问题. 于是乎,第一个版本出现: public long Compute1(uint years) { //初始化为1头牛 long count = 1; if (years <= 3) { return count; } int i = 4; while (i <= years) { int subY