多线程创建方式
1、Thread
/// <summary> /// 线程 /// </summary> public void ThreadDemo() { // 不带参数 Thread thread = new Thread(() => { Console.WriteLine("开始" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); Console.WriteLine("结束"); }); Thread thread1 = new Thread(ComplexCompute); thread.Start(6); Thread th = new Thread(ThreadStartDo); th.IsBackground = true; // 后台启动后,主程序关闭一起关闭。前台程序,主程序关闭仍然执行(默认) th.Start(); // 带参数 Thread th1 = new Thread(new ParameterizedThreadStart(ThreadStartMsg)); th1.Start("带参数"); //匿名方法 Thread thread2 = new Thread(() => { Console.WriteLine(""); }); thread.Start(); } /// <summary> /// 计算 /// </summary> /// <param name="count"></param> public static void ComplexCompute(object count) { int i = 1; while (i < (int)count) { Console.WriteLine("专用线程计时:{0}", i); Thread.Sleep(1000); i++; } }
2、ThreadStart
/// <summary> /// ThreadStart案例 /// </summary> public void ThreadStartDemo() { ThreadStart threadStart = new ThreadStart(ThreadStartDo); Thread thread = new Thread(threadStart); thread.IsBackground = true; thread.Start(); } /// <summary> /// do something /// </summary> public void ThreadStartDo() { Console.WriteLine("ThreadStart"); }
/// <summary> /// TaskFactory案例 /// </summary> public void TaskFactoryDemo() { TaskFactory tf = new TaskFactory(); tf.StartNew(ThreadStartMsg, "TaskFactory"); } /// <summary> /// do something /// </summary> /// <param name="msg"></param> public void ThreadStartMsg(object msg) { Console.WriteLine(msg); }
/// <summary> /// Task案例 /// </summary> public void TaskDemo() { //1、第一种方式 Task.Factory.StartNew(ThreadStartMsg, "Factory"); //2、第二种方式 Task.Factory.StartNew(() => ThreadStartMsg("Factory")); //3、第三种方式 Task task = new Task(ThreadStartMsg, "Task"); task.Start(); //4、第四种方式 var task1 = Task.Run(() => ThreadStartMsg("task1")); //5、第五种方式 var task2 = Task.Run(ThreadStartDo); //7、第五种方式 Task t = new Task(new Action<object>(ThreadStartMsg), "12313"); t.Start(); //8、第五种方式 Task<string> treturn = new Task<string>(new Func<object, string>(ThreadReturnMsg), "23242"); treturn.Start(); } /// <summary> /// do something /// </summary> /// <param name="msg"></param> public void ThreadStartMsg(object msg) { Console.WriteLine(msg); } /// <summary> /// do something /// </summary> /// <param name="msg"></param> public void ThreadStartMsg(object msg) { Console.WriteLine(msg); } /// <summary> /// do something /// 参数和返回值 /// task不能有多参数,只能有一个object参数或没有参数 /// 下面string是返回值,object是参数 /// </summary> /// <param name="msg"></param> public string ThreadReturnMsg(object msg) { Console.WriteLine(msg); return msg.ToString(); }
/// <summary> /// ThreadPool /// </summary> public void ThreadPoolDemo() { // 无参数 ThreadPool.QueueUserWorkItem(ThreadStartMsg, null); // 有参数 ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadPoolTest), new string[] { "test" }); } /// <summary> /// do something /// </summary> /// <param name="msg"></param> public void ThreadStartMsg(object msg) { Console.WriteLine(msg); } /// <summary> /// do something /// </summary> /// <param name="state"></param> public static void ThreadPoolTest(object state) { string[] arry = state as string[];//传过来的参数值 int workerThreads = 0; int CompletionPortThreads = 0; ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads); Console.WriteLine(DateTime.Now.ToString() + "---" + arry[0] + "--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads); }
/// <summary> /// Parallel /// </summary> public void ParallelDemo() { //1、 ParallelLoopResult result = Parallel.For(0, 10, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, i => { Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10); }); Console.WriteLine("是否完成:{0}", result.IsCompleted); Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration); //2、 // 数组遍历 string[] data = { "str1", "str2", "str3" }; ParallelLoopResult result2 = Parallel.ForEach<string>(data, str => { Console.WriteLine(str); }); Console.WriteLine("是否完成:{0}", result2.IsCompleted); Console.WriteLine("最低迭代:{0}", result2.LowestBreakIteration); //3、 // 多任务制定 Parallel.Invoke(Func1, Func2, Func3); Parallel.Invoke(() => { Thread.Sleep(100); Console.WriteLine("method1"); }, () => { Thread.Sleep(10); Console.WriteLine("method2"); }); }