class Program { //创建Task任务的三种方式(无返回值) static void Main(string[] args) { //方法一 Task task1 = new Task(() => { Console.WriteLine("方法一异步任务"); Thread.Sleep(2000); }); task1.Start(); Task.WaitAll(task1); //方法二 Task.Run(() => { Console.WriteLine("方法二异步任务"); }); //方法三 Task.Factory.StartNew(() => { Console.WriteLine("方法三:通过工厂创建异步任务对象"); }); Console.ReadLine(); } }
//创建Task任务的三种方式(无返回值) static void Main(string[] args) { var t1 = new Task(() => TaskMethod("task1")); var t2 = new Task(() => TaskMethod("task2")); t1.Start(); t2.Start(); Task.WaitAll(t1, t2); Task.Run(() => TaskMethod("task3")); Task.Factory.StartNew(() => TaskMethod("task4")); Task.Factory.StartNew(() => TaskMethod("task5"), TaskCreationOptions.LongRunning); Console.WriteLine("主线程开始执行任务"); Task task = new Task(() => { Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作."); for (int i = 0; i < 10; i++) { Console.WriteLine(i); } }); task.Start(); Console.WriteLine("主线程执行其他任务"); task.Wait(); Console.ReadLine(); } static void TaskMethod(string taskName) { Console.WriteLine($"任务名称:{taskName},线程Id:{Thread.CurrentThread.ManagedThreadId},是否为线程池执行:{Thread.CurrentThread.IsThreadPoolThread}"); }
/// <summary> /// 带返回值的Task<int>案例代码 /// </summary> /// <param name="args"></param> static void Main(string[] args) { TaskMethod("main task"); Task<int> task = CreateTask("task1"); task.Start(); int result = task.Result; Console.WriteLine("task1 result is :" + result); task =CreateTask("task2"); task.RunSynchronously();//在当前主线程中同步执行task result = task.Result; Console.WriteLine("task2 result is :" + result); task = CreateTask("task3"); Console.WriteLine(task.Status); task.Start(); while (!task.IsCompleted) { Console.WriteLine(task.Status); Thread.Sleep(1000); } //常规使用方法 task = new Task<int>(() => Getsum()); task.Start(); Console.WriteLine("主线程执行其他任务"); task.Wait(); Console.WriteLine("获取task执行结果" + task.Result.ToString()); Console.ReadLine(); } static Task<int> CreateTask(string name) { return new Task<int>(() => TaskMethod(name)); } static int TaskMethod(string name) { Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}", name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); Thread.Sleep(TimeSpan.FromSeconds(2)); return 42; } static int Getsum() { int sum = 0; Console.WriteLine("使用Task执行异步操作."); for (int i = 0; i < 100; i++) { sum += i; } return sum; }
/// <summary> /// async/await实现带返回值task /// </summary> /// <param name="args"></param> static void Main(string[] args) { Task<int> task = AsyncMethod(); Console.WriteLine("主线程执行其他处理,线程id:"+Thread.CurrentThread.ManagedThreadId); for (int i = 1; i <= 3; i++) Console.WriteLine("Call Main()"); int result = task.Result;//阻塞主线程 Console.WriteLine("任务执行结果:{0}", result); Console.ReadLine(); } async static Task<int> AsyncMethod() { Console.WriteLine("使用Task执行异步操作.线程id:" + Thread.CurrentThread.ManagedThreadId); await Task.Delay(1000); int sum = 0; Console.WriteLine("使用Task执行异步操作.线程id:"+Thread.CurrentThread.ManagedThreadId); for (int i = 0; i < 100; i++) { sum += i; } return sum; }
/// <summary> /// 并行任务 /// </summary> /// <param name="args"></param> static void Main(string[] args) { ConcurrentStack<int> stack = new ConcurrentStack<int>(); var t1 = new Task(() => { stack.Push(1); stack.Push(2); }); t1.Start(); Console.WriteLine(DateTime.Now.ToString()); //t2 t3并行执行 var t2 = t1.ContinueWith((task) => { int result; stack.TryPop(out result); Console.WriteLine("Task t2 pop result={0},Thread id {1}", result, Thread.CurrentThread.ManagedThreadId); }); //t2,t3并行执行 var t3 = t1.ContinueWith(t => { int result; stack.TryPop(out result); Console.WriteLine("Task t3 pop result={0},Thread id {1}", result, Thread.CurrentThread.ManagedThreadId); }); Task.WaitAll(t2, t3); //t4串行执行 var t4 = Task.Factory.StartNew(() => { Console.WriteLine("当前集合元素个数:{0},Thread id {1}", stack.Count, Thread.CurrentThread.ManagedThreadId); }); t4.Wait(); Console.ReadLine(); }
/// <summary> /// 子任务 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Task<string[]> parent = new Task<string[]>(() => { string[] array = new string[2]; new Task(() => { array[0] = "result1";Thread.Sleep(2000); }, TaskCreationOptions.AttachedToParent).Start(); new Task(() => { array[1] = "result2"; Thread.Sleep(2000); }, TaskCreationOptions.AttachedToParent).Start(); return array; }); parent.ContinueWith((task) => { foreach(string str in task.Result) { Console.WriteLine("结果:" + str); } }); parent.Start(); Console.WriteLine("主线程"); parent.Wait();//wait只能等到父Task结束,不能等到父线程的ContinueWith结束 Console.WriteLine("主线程"); Console.ReadLine(); }
/// <summary> /// 取消任务 /// </summary> /// <param name="args"></param> static void Main(string[] args) { var cts = new CancellationTokenSource(); var task = new Task<int>(() => TaskMethod("task 1", 10, cts.Token), cts.Token); Console.WriteLine(task.Status); Console.ReadLine(); cts.Cancel(); Console.WriteLine(task.Status); Console.WriteLine("task1已经被取消!"); cts = new CancellationTokenSource(); task = new Task<int>(() => TaskMethod("task2 ", 10, cts.Token), cts.Token); task.Start(); for (int i = 0; i < 10; i++) { Thread.Sleep(500); Console.WriteLine(task.Status); } cts.Cancel(); for (int i = 0; i < 5; i++) { Thread.Sleep(500); Console.WriteLine(task.Status); } Console.ReadLine(); } static int TaskMethod(string name, int seconds, CancellationToken token) { Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}", name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); for(int i = 0; i < seconds; i++) { Thread.Sleep(500); if (token.IsCancellationRequested) { return -1; } } return 42 * seconds; }