.Net 线程问题解答
目录
基础篇
? ? ? ? ?
怎样创建一个线程 受托管的线程与 Windows 线程 前台线程与后台线程 名为 BeginXXX 和 EndXXX 的方法是做什么用的 异步和多线程有什么关联
WinForm 多线程编程篇
? ? ? ? ?
我的多线程 WinForm 程序老是抛出 InvalidOperationException ,怎么解决? Invoke,BeginInvoke 干什么用的,内部是怎么实现的 每个线程都有消息队列吗? 为什么 Winform 不允许跨线程修改 UI 线程控件的值 有没有什么办法可以简化 WinForm 多线程的开发
线程池
? ? ? ?
同步
线程池的作用是什么? 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? 为什么不要手动线程池设置最大值? .Net 线程池有什么不足?
? ? ? ?
CLR 怎样实现 lock(obj)锁定? WaitHandle 是什么,他和他的派生类怎么使用 什么是用双锁实现 Singleton,为什么要这样做,为什么有人说双锁检验是不安全的 互斥对象(Mutex)、事件(Event)对象与 lock 语句的比较
什么时候需要锁定
? ? ? ? ? ?
只有共享资源才需要锁定 把锁定交给数据库 了解你的程序是怎么运行的 业务逻辑对事务和线程安全的要求 计算一下冲突的可能性 请多使用 lock,少用 Mutex
Web 和 IIS
? ?
应用程序池,WebApplication,和线程池之间有什么关系 Web 页面怎么调用异步 WebService
基础篇
怎样创建一个线程
我只简单列举几种
常用的方法,详细可参考.Net 多线程总结(一) 一)使用 Thread 类 ThreadStart threadStart=new ThreadStart(Calculate);//通过 ThreadStart 委托告诉子线程讲执行什么方法,这里 执行一个计算圆周长的方法 Thread thread=new Thread(threadStart); thread.Start(); //启动新线程
public void Calculate(){ double Diameter=0.5; Console.Write("The perimeter Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI); } 二)使用 Delegate.BeginInvoke delegate double CalculateMethod(double Diameter); //申明一个委托,表明需要在子线程上执行的方法的函数 签名 static CalculateMethod calcMethod = new CalculateMethod(Calculate);//把委托和具体的方法关联起来 static void Main(string[] args) { //此处开始异步执行,并且可以给出一个回调函数(如果不需要执行什么后续操作也可以不使用回调) calcMethod.BeginInvoke(5, new AsyncCallback(TaskFinished), null); Console.ReadLine(); }
//线程调用的函数,给出直径作为参数,计算周长 public static double Calculate(double Diameter) { return Diameter * Math.PI; }
//线程完成之后回调的函数 public static void TaskFinished(IAsyncResult result) { double re = 0; re = calcMethod.EndInvoke(result); Console.WriteLine(re); }
三)使用 ThreadPool.QueueworkItem
WaitCallback w = new WaitCallback(Calculate); //下面启动四个线程,计算四个直径下的
圆周长 ThreadPool.QueueUserWorkItem(w, 1.0); ThreadPool.QueueUserWorkItem(w, 2.0); ThreadPool.QueueUserWorkItem(w, 3.0); ThreadPool.QueueUserWorkItem(w, 4.0); public static void Calculate(double Diameter) { return Diameter * Math.PI; }
下面两条来自于 cnblogs/tonyman/archive/2007/09/13/891912.html
受托管的线程与 Windows 线程
必须要了解,执行.NET 应用的线程实际上仍然是 Windows 线程。但是,当某个线程被 CLR 所知时,我 们将它称为受托管的线程。具体来说,由受托管的代码创建出来的线程就是受托管的线程。如果一个线程 由非托管的代码所创建,那么它就是非托管的线程。不过,一旦该线程执行了受托管的代码它就变成了受 托管的线程。 一个受托管的线程和非托管的线程的区别在于, CLR 将创建一个 System.Threading.Thread 类的实例来代 表并操作前者。 在内部实现中, CLR 将一个包含了所有受托管线程的
列表保