读后总结:



1. 为什么要有应用程序域(AppDemain)这个概念?



都知道每一个进程间都是相互隔离的,所有在进程间通讯是非常麻烦的事,.NET为了能够解决进程间的通信问题,推出了一个新的概念。于是.NET多个进程可以运行在同一个应用程序域中,这样不同应用程序域之间可以相互隔离,做到了安全性,同时降低了进程间通信的难度。



2. 为什么要用多线程?



如果只有一个CPU的情况下,我们知道多线程也是有一个CPU去执行的,并且一次只能执行单个线程,通过时间片的切换来根据线程的优先级轮流执行线程。但是时间片的切换也是需要消耗资源的,所以为什么用多个线程?其实在某些情况下,多个线程可以提供系统的性能。比如:在系统请求大容量的数据时使用多线程,把数据输出工作交给异步线程,使主线程保持其稳定性去处理其他问题。


3. 前台线程和后台线程对程序有什么影响?


Thread.Start()启动的线程默认为前台线程,而系统必须等待所有前台线程运行结束后,应用程序域才会自动卸载。线程Thread有一个属性IsBackground,通过把此属性设置为true,就可以把线程设置为后台线程!这时应用程序域将在主线程完成时就被卸载,而不会等待异步线程的运行。当时如果主线程等待其后台线程完成后再结束,这就会用到thread.Join()


4. CLR的线程池是怎样工作的?


CLR线程池并不会在CLR初始化的时候立刻建立线程,而是在应用程序要创建线程来执行任务时,线程池才初始化一个线程。线程的初始化与其他的线程一样。在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。这样既节省了建立线程所造成的性能损耗,也可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。


5. 当利用线程池 ThreadPool.QueueUserWorkItem(WaitCallback,Object) 去调用多线程时,可以看到 QueueUserWorkItem只能传一个参数,并且没有返回值,那么怎样实现传多个参数和带返回值的异步调用呢?


可以利用Delegate实现带有多个参数和返回值的异步调用。


6. 当利用Delegate实现线程的异步时,怎样监控运行多个对象已经完成?


监控一个对象已经完成,可以用的IAsyncResult.WaitHandle.WaitOne 函数,但是监控多个运行对象时,WaitHandle准备了另外两个静态方法:WaitAny(waitHandle[], int)与WaitAll (waitHandle[] , int)。


7. 怎样利用Delegate完成异步调用?


一是用轮询的方式去判断异步是否完成,比如


//建立委托


MyDelegate myDelegate = new MyDelegate(Hello);


//异步调用委托,获取计算结果


IAsyncResult result=myDelegate.BeginInvoke("Leslie", null, null);


//在异步线程未完成前执行其他工作


while (!result.IsCompleted)


{


Thread.Sleep(200); //主线程操作


Console.WriteLine("Main thead do work!");


}


string data=myDelegate.EndInvoke(result);


二是用它的回调函数


MyDelegate myDelegate = new MyDelegate(Hello);


myDelegate.BeginInvoke("kntao",newAsyncCallback(Completed),null);


8.请举例CLR线程池的I/O线程操作?


I/O 线程是.NET专为访问外部资源所设置的一种线程,因为访问外部资源常常要受到外界因素的影响,为了防止让主线程受影响而长期处于阻塞状态,.NET为多个I/O操作都建立起了异步方法,例如:FileStream、TCP/IP、WebRequest、WebService等等,而且每个异步方法的使用方式都非常类似,都是以BeginXXX为开始,以EndXXX结束,


9.怎样避免多线程操作同一数据?


.NET提供了lock、Monitor、Interlocked等多个锁定数据的方式。