首页 新闻 会员 周边

关于asp.net线程池和对象用完赋null的问题

0
悬赏园豆:200 [已解决问题] 解决于 2009-05-23 20:11

1.我看有些程序用到FileStream,用过了,也Close掉了,为什么还要给它赋个null?

2.在Global.asax里的Application_BeginRequest或Session_Start里用new ThreadStart新开一个线程,这个线程占不占asp.net线程池?

3.什么样的线程或异步操作能不占用asp.net线程池,从例子上看,SqlCommand和FileStream的异步操作是不占的。

参考
http://msdn.microsoft.com/zh-cn/magazine/cc163463.aspx
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_fxfund/html/dbdd55e7-d6b9-4f9e-8abb-ab0edd4457f7.htm

问题补充: 谢谢Galactica! 第1个问题我基本明白了,只要用using语句尽量缩小对象的生存期,就可以不用赋null了吧。 第二、三个问题中的TreadPool 类型的线程还不太明白,现在研究一下。 还有个问题是,假如在Global.asax里的Application_BeginRequest里新建一个WriteFile线程做一个写文件的操作,如何做异常处理比较好?还有就是这样做是否可以像异步操作一样提高吞吐率?因为按Galactica的说法,WriteFile是不占asp.net 线程池的。 刚看了下TreadPool ,是不是说在Application_BeginRequest里用ThreadPool.QueueUserWorkItem方法建的线程就会占用asp.net 线程池?
灰灰狼的主页 灰灰狼 | 初学一级 | 园豆:5
提问于:2009-05-23 14:32
< >
分享
最佳答案
0

1,负值null有两个原因,一个是C++编程中对指针的处理的步骤被沿用到了.net代码中;二是尽快告诉GC,当前的FileStream对象可以销毁了,当 FileStream 调用 Close后还有耗时的操作,该方式可以让 FileStream对象尽快被GC回收,而不是等到引用该 FileStream 对象的代码结束后才交给GC回收;

2,这个线程不占用 asp.net 线程池,如果你使用TreadPool的话,将占用asp.net线程池,因为 asp.net使用 ThreadPool 管理线程;

3,你自己创建的非 TreadPool 类型线程都不占用asp.net线程池;所有异步委托的创建和回调都占用 asp.net 线程池。SqlCommand和FileStream异步操作的创建和回调,也就是BeginXXXX和EndXXXX也占用asp.net线程,只是该占用非常短,真正对数据源读写的操作将在线程池管理的线程之外执行,其中大部分都是非托管代码以及COM交互。

Launcher | 高人七级 |园豆:45045 | 2009-05-23 14:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册