/// <summary> /// 反映拷贝进度的一个委托 /// </summary> /// <param name="count"></param> /// <param name="index"></param> delegate void DelegateCopyProgressHandler(int count,int index); /// <summary> /// 本示例演示主线程与子线程优先级(默认情况下主线程具有较高优先级) /// 默认情况,在新开启一个子线程的时候,他是前台线程. /// 只有,将线程的IsBackground属性设为true;他才是后台线程 /// </summary> static void Demo1() { Thread thread1 = new Thread(new ThreadStart(worker1)); thread1.Name = "A"; thread1.Start(); for (int i = 0; i < 100; i++) { Console.WriteLine("主线程执行{0}次",i+1); } Console.WriteLine("--------------------主线程执行结束----------------"); } static void worker1() { for (int i = 0; i < 100; i++) { Console.WriteLine("{0}线程执行第{1}次",Thread.CurrentThread.Name,i+1); } Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name); } /// <summary> /// 子线程优先级别高于普通级别Normal(通过测试发现子线程总是获得较多的执行机会) /// </summary> static void Demo2() { new Thread(new ParameterizedThreadStart(delegate(object obj) { Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; Thread.CurrentThread.Name = obj.ToString(); for (int i = 0; i < 100; i++) { Console.WriteLine("{0}线程执行第{1}次", Thread.CurrentThread.Name, i + 1); } Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name); })).Start("A"); for (int i = 0; i < 100; i++) { Console.WriteLine("主线程执行{0}次", i + 1); } Console.WriteLine("--------------------主线程执行结束----------------"); } /// <summary> /// 测试当子线程是前台线程,则主线程结束是否影响其他线程的执行(运行结果主线程执行完成后如果发现仍有前台子线程在运行之中,那么子线程继续正常运行) /// </summary> static void Demo3() { Thread.CurrentThread.Name = "主线程"; new Thread(new ParameterizedThreadStart(item => { Thread parentThread = item as Thread; Thread.CurrentThread.Name = "A"; for (int i = 0; i < 100; i++) { Thread.Sleep(500); Console.WriteLine("{0}线程执行第{1}次,{2}状态:{3}", Thread.CurrentThread.Name, i + 1, parentThread.Name,parentThread.ThreadState); } Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name); })).Start(Thread.CurrentThread); for (int i = 0; i < 10; i++) { Console.WriteLine("主线程执行{0}次", i + 1); } Console.WriteLine("--------------------主线程执行结束----------------"); Console.WriteLine("主线程结束时状态1:" + Thread.CurrentThread.ThreadState.ToString()); } /// <summary> /// 当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束 /// </summary> static void Demo4() { Thread.CurrentThread.Name = "主线程"; new Thread(item => { Thread parentThread = item as Thread; Thread.CurrentThread.Name = "A"; Thread.CurrentThread.IsBackground = true; for (int i = 0; i < 100; i++) { Thread.Sleep(500); Console.WriteLine("{0}线程执行第{1}次,{2}状态:{3}", Thread.CurrentThread.Name, i + 1, parentThread.Name, parentThread.ThreadState); } Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name); }).Start(Thread.CurrentThread); for (int i = 0; i < 10; i++) { Console.WriteLine("主线程执行{0}次", i + 1); } Console.WriteLine("--------------------主线程执行结束----------------"); Console.WriteLine("主线程结束时状态1:" + Thread.CurrentThread.ThreadState.ToString()); } /// <summary> /// 线程跨应用程序域执行 /// </summary> static void Demo6() { Thread.CurrentThread.Name = "主线程"; AppDomain domainA = AppDomain.CreateDomain("JiangApp"); CrossAppDomainDelegate crossHandler = new CrossAppDomainDelegate(delegate() { AppDomain currentDomain = AppDomain.CurrentDomain; for (int i = 0; i < 10; i++) { Console.WriteLine("在/"{0}/"域中执行/"{1}/"线程第{2}次", currentDomain.FriendlyName, Thread.CurrentThread.Name,i+1); Thread.Sleep(500); if (i == 4) { throw new Exception(currentDomain.FriendlyName + "域内发生异常"); } } }); domainA.DoCallBack(crossHandler); for (int i = 0; i < 10; i++) { Console.WriteLine("在/"{0}/"域中执行/"{1}/"线程第{2}次", AppDomain.CurrentDomain.FriendlyName, Thread.CurrentThread.Name, i + 1); Thread.Sleep(500); } } /// <summary> /// 线程池示范 /// </summary> static void Demo7() { int workerThreadCount = 0; int compleThreadCount = 0; ThreadPool.GetMaxThreads(out workerThreadCount,out compleThreadCount); Console.WriteLine("最大辅助线程数量:{0},最大异步I/O线程数目:{1}",workerThreadCount,compleThreadCount); ThreadPool.QueueUserWorkItem(item => { Thread.CurrentThread.Name = "A"; Console.WriteLine("当前线程"+(Thread.CurrentThread.IsBackground?"是后台线程":"前台线程")); for (int i = 0; i < 10; i++) { Console.WriteLine("{0}线程执行第{1}次",Thread.CurrentThread.Name,i+1); } }); ThreadPool.QueueUserWorkItem(item => { Thread.CurrentThread.Name = "B"; Console.WriteLine("当前线程" + (Thread.CurrentThread.IsBackground ? "是后台线程" : "前台线程")); for (int i = 0; i < 10; i++) { Console.WriteLine("{0}线程执行第{1}次",Thread.CurrentThread.Name,i+1); } }); Thread.Sleep(500); } /// <summary> /// 异步编程示范 /// </summary> static void Demo8() { DelegateCopyProgressHandler copyProgressHandler = new DelegateCopyProgressHandler((count, index) => { Console.WriteLine("当前拷贝进度{0}/{1}",index,count); Thread.Sleep(1000); }); List<IAsyncResult> list = new List<IAsyncResult>(); //循环拷贝 for (int i = 0; i < 20; i++) { list.Add(copyProgressHandler.BeginInvoke(10, i + 1, null, null)); } //Array.ForEach<IAsyncResult>(list,); bool isOver = true; while (true) { isOver = true; Array.ForEach<IAsyncResult>(list.ToArray<IAsyncResult>(), item => { if (!item.IsCompleted) { isOver = false; } }); if (isOver) { break; } Console.WriteLine("异步调用尚未结束,主线程等待..."); Thread.Sleep(500); } }