摘要:
体验
微软公司正在领导一次新的互联网技术革命,这就是.net。.net是一种全新的基于internet的编程模型。2月13日微软公司在美国正式发布了全新的基于.net平台的开发工具——visual studio.net,这标志着微软.net时代的全面到来。
我想通过本文,和大家一起用.net开发一个简单的小游戏——猜数字,与大家一起分享我在学习.net技术中的一......
摘要:使用线程和线程处理
创建、管理和销毁托管线程是非常容易的,但如果不了解托管线程和非托管线程之间的关系以及 threadabortexception,则这样做可能会导致预料不到的副作用。
创建线程 [c#]
在创建操作系统进程时,操作系统将插入一个线程以执行该进程(包括任何原始应用程序域)中的代码。从此刻起,就可以创建和销毁应用程序域,而不必创建或销毁任何操作系统线程。如果正在执行的代码是托管......
在.NET里的垃圾回收编程.net 框架的垃圾回收器管理应用程序的内存分配与释放.每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存.只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间.但是,内存不是无限大的.最终,垃圾回收器必须执行回收以释放一些内存.垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间.当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存.
根据您开发背景的不同,您在内存管理方面的经验也会有所不同.在某些情况下,您可能需要让您的编程习惯来适应公共语言运行库提供的自动内存管理. 【程序编程相关:
[DNN功能]列表管理添加中国的省份选择】
开发人员在内存管理方面的背景 【推荐阅读:
.net下基于API封装的DirectU】
com 开发人员习惯于将实现引用计数作为一个手动的内存管理技术.每次引用一个对象,计数器就递增.如果对对象的引用超出了范围,计数器就递减.当对象的引用计数达到零时,对象被终止并释放其内存. 【扩展信息:
写了个单元测试辅助类,用于读取文本加入数】
com 开发人员
引用计数方案会引发许多调试错误.如果未能严格地按照引用计数的规则进行操作,对象可能被过早释放或者未引用的对象积存在内存中.循环引用也是常见的问题根源.循环引用出现在子对象引用父对象,而父对象又引用子对象时.这种情况使两个对象都不能被释放或销毁.唯一的解决方案就是让父对象与子对象都遵守一个固定的使用与销毁模式,例如总是先由父对象删除子对象.
当使用托管语言开发应用程序时,运行库的垃圾回收器免除了对引用进行计数的需要,因此也就避免了由这种手动管理内存方案引发的错误.
c++ 开发人员
c++ 开发人员熟悉与手动内存管理相关的任务.在 c++ 中,当您使用 new 运算符为对象分配内存时,您必须使用 delete 运算符释放对象的内存.这可能导致多种错误,例如忘记释放对象.引起内存泄漏或试图访问已被释放的对象的内存.
当使用 c++ 的托管扩展或其他托管语言开发应用程序时,您就不必使用 delete 运算符释放对象了.垃圾回收器在当对象不再被应用程序使用时自动为您完成这些操作.
考虑到手动管理短期对象内存的相关成本,c++ 开发人员可能习惯于避免使用这些对象.对于两次回收间创建的然后又不再使用的托管短期对象,分配与释放内存的成本非常低.在 .net 框架中,实际上已经对垃圾回收器进行了优化来管理具有较短生存期的对象.当开发托管应用程序时,在短期对象可以简化代码的情况下使用它们是非常合适的.
visual basic 开发人员
visual basic 开发人员习惯于自动内存管理.您熟悉的编程惯例将应用于您在 .net 框架中创建的大多数托管对象.但是,当创建或使用封装非托管资源的对象时,您应该特别注意使用 dispose 方法的推荐设计模式.
.net 框架支持的托管语言比此处介绍的还要多.不管您使用哪一种托管语言,.net 框架的垃圾回收器都提供自动内存管理.它为托管对象分配与释放内存,并在必要时执行 finalize 方法与析构函数来适当地清理非托管资源.自动内存管理通过消除手动内存管理方案引起的常见问题简化了开发.
finalize 方法与析构函数
对于您的应用程序创建的大多数对象,可以依靠 .net 框架的垃圾回收器隐式地执行所有必要的内存管理任务.但是,在您创建封装非托管资源的对象时,当您在应用程序中使用完这些非托管资源之后,您必须显式地释放它们.最常见的一类非托管资源就是包装操作系统资源的对象,例如文件.窗口或网络连接.虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源.对于这些类型的对象,.net 框架提供 object.finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源.默认情况下,finalize 方法不执行任何操作.如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您必须在类中重写 finalize 方法.当使用 c# 与 c++ 的托管扩展以外的编程语言进行开发时,您可以实现 finalize 方法.c# 与托管扩展提供析构函数作为编写终止代码的简化机制.析构函数自动生成 finalize 方法与对基类的 finalize 方法的调用.在 c# 与托管扩展编程语言中,您必须为终止代码使用析构函数语法.
垃圾回收器使用名为“终止队列”的内部结构跟踪具有 finalize 方法的对象.每次您的应用程序创建具有 finalize 方法的对象时,垃圾回收器都在终止队列中放置一个指向该对象的项.托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项.
实现 finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们.用 finalize 方法回收对象使用的内存需要至少两次垃圾回收.当垃圾回收器执行回收时,它只回收没有终结器的不可访问对象的内存.这时,它不能回收具有终结器的不可访问对象.它改为将这些对象的项从终止队列中移除并将它们放置在标为准备终止的对象列表中.该列表中的项指向托管堆中准备被调用其终止代码的对象.一个特殊的运行库线程开始处于活动状态并调用列表中对象的 finalize 方法,然后将这些项从列表中移除.后来的垃圾回收将确定终止的对象确实是垃圾,因为标为准备终止对象的列表中的项不再指向它们.在后来的垃圾回收中,实际上回收了对象的内存.
清理非托管资源
通过将对象的范围限制为 protected,您可以防止应用程序的用户直接调用对象的 finalize 方法.除此之外,我们强烈建议您不要直接从应用程序代码中调用非基类的类的 finalize 方法.为适当处置非托管资源,建议您实现公共的 dispose 或 close 方法,这两个方法执行必要的对象清理代码.idisposable 接口为实现接口的资源类提供 dispose method.因为 dispose 方法是公共的,所以应用程序的用户可以直接调用该方法来释放非托管资源占用的内存.如果正确实现了 dispose 方法,则 finalize 方法(或者 c# 中的析构函数或 c++ 的托管扩展)就成为避免在没有调用 dispose 方法的情况下清理资源的一种防护措施.
实现 dispose 方法 [c#]
类型的 dispose 方法应该释放它拥有的所有资源.它还应该通过调用其父类型的 dispose 方法释放其基类型拥有的所有资源.该父类型的 dispose 方法应该释放它拥有的所有资源并同样也调用其父类型的 dispose 方法,从而在整个基类型层次结构中传播该模式....
下一页 摘要:使用异步 i/o 完成事件,线程池中的线程将只在收到数据时对数据进行处理,一旦处理完数据,该线程就会返回到线程池中。
若要进行异步 i/o 调用,必须将操作系统 i/o 句柄与线程池相关联,并且必须指定一个回调方法。当 i/o 操作完成后,线程池中的线程将调用该回调方法。
下面的 c# 代码示例说明了一个简单的异步 i/o 操作。
注意 该示例需要 100mb 以上的可用内存。
[c#]
......