首先在Visual Studio新建了一个WinForm项目WinFormApp里面会默认有个叫Form的窗口假设项目WinFormApp的功能是为了查询远端Ftp服务器的文档目录然后把查到的结果显示到Form的界面上通常的做法是在Formcs类中添加一个QueryFtpFiles()方法用于对远端的ftp服务器进行读操作然后把读到的内容显示到界面上就算完成了 在这个项目完成后一般会先在本地或局域网内的某个Ftp服务器上先做个测试这时你会发现程序很完美地运行着当你兴致沖沖地把代码交给你领导的时候你的上司拿了远在美国的ftp服务器来试运行点击查询按钮执行QueryFtpFiles()查询操作的时候悲剧发生了——页面死掉了(没有响应)……你是不是觉得很没面子?有木有? 这里有个问题就是在执行QueryFtpFiles()方法时由于是对远端的ftp服务器进行读操作本身IO操作就比较耗时再考虑到网络延迟等因素你的界面就不得不停下了等待读操作的完成如果在这个读操作完成前你急不可耐地点了下界面就出现了没有响应的后果 其实我在运行这个项目的时候实际上是在运行由这个项目自动在Debug或Release目录下生成的WinFormAppexe应用程序而WinFormAppexe对于我的Windows Server即操作系统来说他就是一个进程 操作系统书中讲传统的进程有两个基本属性拥有资源的独立单位和可独立调度和分配的基本单位由于在进程的创建撤销和切换中系统必须耗费较大的时空开销引入线程后传统的进程的两个基本属性分开线程作为调度和分配的基本单位进程作为独立分配资源的单位也就是说在完成一个复杂的功能时可以在一个进程中建立多个线程每个线程分别完成某一项简单功能进程通过调度和排列组合这些线程来实现这个复杂的功能 线程其实就是一段代码一个方法或一连串方法这段代码或方法可以去完成某个功能也可以什么都不用做比如上面提到的QueryFtpFiles()它其实就满足作为线程的基本条件 再回到原来的没有响应的问题上在执行WinFormAppexe这个进程的时候这个进程会调用UI线程其实也就是Formcs内的代码以及它调用的其他类的代码因为QueryFtpFiles()也在Formcs这个类中所以它也算是UI线程的一部分WinFormAppexe进程执行时会首先调用这个UI线程(若没有定义其他线程这时UI线程应该也是这个进程的唯一线程)这个UI线程在执行QueryFtpFile()方法的过程中由于耗时很多以至于这个进程其他什么什么操作都要停下来等待包括你去点击界面的操作 问题的描述应该就是这样了至于解决方法可以在UI线程中再定义另外一个线程thread用来执行QueryFtpFile()方法就可以了 |