标签:
class ThreadTest { bool done; static void Main() { ThreadTest tt = new ThreadTest(); // Create a common instance new Thread(tt.Go).Start(); tt.Go(); } // Note that Go is now an instance method void Go() { if (!done) { done = true; Console.WriteLine("Done"); } } }
class ThreadTest { static bool done; // Static fields are shared between all threads static void Main() { new Thread(Go).Start(); Go(); } static void Go() { if (!done) { done = true; Console.WriteLine("Done"); } } }
Thread t = new Thread ( () => Print ("Hello from t!") ); new Thread (() => {...}).Start(); new Thread (delegate(){...}).Start();
Thread t = new Thread (Print).Start ("Hello from t!"); static void Print (object messageObj) //函数入参只能为 object 类型
for (int i = 0; i < 10; i++) new Thread (() => Console.Write (i)).Start(); Output: 0223557799
Thread.CurrentThread.Name = "main";
Thread worker = new Thread (Go); worker.Name = "worker";
线程的前后台与线程的优先级无关。
某些时候需要等待后台线程执行完成之后退出程序,如释放资源,可如下方式实现:
enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }
提升线程的优先级需要仔细认真的考虑,因为可能造成资源的死锁。
线程的优先级是在进程的优先级之下的,如果A进程中的A1线程想与B进程中B1线程争夺资源,首先应提高A进程的优先级:
using (Process p = Process.GetCurrentProcess()) p.PriorityClass = ProcessPriorityClass.High;
ProcessPriorityClass.High为进程的最高等级,如果你的进程设置为 High,并且进入了无限循环,操作系统将会被锁定。由于这个原因,High 一般用于实时系统 Realtime,改进程在进入时间轮片之后,将不会出让 CPU 给任何进程。
异常处理try/catch/finally需要写在函数内部,否则会导致主程序的崩溃,程序直接退出。
通过Tread创建线程需要消耗时间来组织资源创建线程,并且会消耗内存。使用线程池的线程不会有这些问题。进入线程池方式:
下列间接使用线程池构建:
使用线程池需注意:
查询当前线程是否在线程池中:Thread.CurrentThread.IsThreadPoolThread.
Task.Factory.StartNew (Go, arg1, arg2…);
Go的参数可以不为object类型
接收返回参数Task<TResult>:
Task<string> task = Task.Factory.StartNew<string>(() => DownloadString ("http://www.linqpad.net")); string result = task.Result; //use the result, block the main thread until the task finished
当使用返回参数时,相当于在调用参数之前调用了 task.Wait();
当使用.NET为4.0之前版本时,我们只能使用ThreadPool.QueueUserWorkItem和Asynchronous delegates两种方式。
与ThreadPool.QueueUserWorkItem区别是:Asynchronous delegates可以接收返回结果,并且可以在主线程中统一处理异常。
EndInvoke做的三件事:
拆分实现:
method在BeginInvoke时传递,通过IAsyncResult.AsyncState传递。其中IAsyncResult.AsyncState为object类型,可以传递任何变量。
标签:
原文地址:http://www.cnblogs.com/zhuhc/p/4329122.html