多线程入门

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace ReadOnly
{
    class Program
    {
        #region ParallelException
        //运行结果:
        // Run1
        // Run2
        // Exception inRun1
        // Exception in Run2
        public static void Run1()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Run1");
            throw new Exception("Exception inRun1");
        }
        public static void Run2()
        {
            Thread.Sleep(3000);
            Console.WriteLine("Run2");
            throw new Exception("Exception in Run2");
        }

        public static void ParallelInvokeMethod()
        {
            try
            {
                Parallel.Invoke(Run1, Run2);
            }
            catch (AggregateException aex)
            {
                foreach (var ex in aex.InnerExceptions)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
        #endregion
        #region ParallelBreakStop 
        //Break: 当然这个是通知并行计算尽快的退出循环,比如并行计算正在迭代100,那么break后程序还会迭代所有小于100的。
        //Stop:这个就不一样了,比如正在迭代100突然遇到stop,那它啥也不管了,直接退出。

        //运行结果:
        //bagStop count is 300
        //bagBreak count is 327 694 303

        public static void ParallelBreakStop()
        {
            ConcurrentBag<int> bagStop = new ConcurrentBag<int>();
            Parallel.For(0, 1000, (i, state) =>
            {
                if (bagStop.Count == 300)
                {
                    state.Stop();
                    return;
                }
                bagStop.Add(i);
            });
            ConcurrentBag<int> bagBreak = new ConcurrentBag<int>();
            Parallel.For(0, 1000, (i, state) =>
            {
                if (bagBreak.Count == 300)
                {
                    state.Break();
                    return;
                }
                bagBreak.Add(i);
            });
            Console.WriteLine("bagStop count is " + bagStop.Count);
            Console.WriteLine("bagBreak count is " + bagBreak.Count);
        }
        #endregion

        #region 线程安全集合
        //Dictionary ConcurrentDictionary,Stack ConcurrentStack,Queue ConcurrentQueue,List ConcurrentBag
        //运行结果:
        //Linq time is 631
        //PLinq time is 537
        public static void ParallelLinq()
        {
            Stopwatch sw = new Stopwatch();
            List<Custom> customs = new List<Custom>();
            for (int i = 0; i < 2000000; i++)
            {
                customs.Add(new Custom() { Name = "张三", Age = 21, Address = "北京" });
                customs.Add(new Custom() { Name = "李四", Age = 26, Address = "南京" });
                customs.Add(new Custom() { Name = "王五", Age = 29, Address = "太原" });
                customs.Add(new Custom() { Name = "赵六", Age = 30, Address = "武汉" });
                customs.Add(new Custom() { Name = "田七", Age = 60, Address = "徐州" });
            }

            sw.Start();
            var result = customs.Where<Custom>(c => c.Age > 26).ToList();
            sw.Stop();
            Console.WriteLine("Linq time is {0}.", sw.ElapsedMilliseconds);

            sw.Restart();
            sw.Start();
            var result2 = customs.AsParallel().Where<Custom>(c => c.Age > 26).ToList();
            sw.Stop();
            Console.WriteLine("PLinq time is {0}.", sw.ElapsedMilliseconds);
        }
        private class Custom
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public string Address { get; set; }
        }
        #endregion

        #region Task
        private static void CreatTask()
        {
            var task1 = new Task(() =>
            {
                Console.WriteLine("new Task");
            });
            task1.Start();

            var task2 = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Task.Factory.StartNew");
            });
        }
        //task1.Start();  task1.Wait() Task.WaitAll(Task[]) Task.WaitAny(task1,task2) Task.ContinueWith
        //Task.WaitAll(tasks,5000);
        //for (int i = 0; i<tasks.Length;i++ )
        //{
        //    if (tasks[i].Status != TaskStatus.RanToCompletion)
        //    {
        //        Console.WriteLine("Task {0} Error!",i + 1);
        //    }
        //}
        //结果:
        //task1 Begin
        //task2 Begin
        //task1 Finish
        //Task1的结果:task1 finished
        //task1 finished!
        //continueTask result!
        //task2 Finish
        private static void TaskContinueWidth()
        {
            var task1 = new Task<string>(() =>
            {
                Console.WriteLine("task1 Begin");
                System.Threading.Thread.Sleep(2000);
                Console.WriteLine("task1 Finish");
                return "task1 finished";
            });
            var task2 = new Task(() =>
            {
                Console.WriteLine("task2 Begin");
                System.Threading.Thread.Sleep(3000);
                Console.WriteLine("task2 Finish");
            });


            task1.Start();
            task2.Start();
            var result = task1.ContinueWith<string>(Task1 =>
            {
                Console.WriteLine("Task1的结果:" + Task1.Result);
                Console.WriteLine("task1 finished!");
                return "continueTask result!";
            });

            Console.WriteLine(result.Result.ToString());
        }

        //Task取消
        //运行结果:
        //Press enter to cancel task...
        //Task取消
        //Task 取消成功!

        private static void CancelTask()
        {
            //public class CancellationTokenSource
            // 摘要:
            //     Signals to a System.Threading.CancellationToken that it should be canceled.
            var tokenSource = new CancellationTokenSource();
            var token = tokenSource.Token;
            var task = Task.Factory.StartNew(() =>
            {
                for (var i = 0; i < 1000; i++)
                {
                    System.Threading.Thread.Sleep(1000);
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine("Task 取消成功!");
                        return;
                    }
                }
            }, token);
            token.Register(() =>
            {
                Console.WriteLine("Task取消");
            });
            Console.WriteLine("Press enter to cancel task...");
            Console.ReadKey();
            tokenSource.Cancel();
            Console.ReadKey();
        }
        #endregion
        static void Main(string[] args)
        {
            ParallelInvokeMethod();
            ParallelBreakStop();
            ParallelLinq();
            TaskContinueWidth();
            CancelTask();
            Console.ReadKey();
        }
    }
}

  

原文地址:https://www.cnblogs.com/liuqiyun/p/10078161.html