zoukankan      html  css  js  c++  java
  • 多线程入门

    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();
            }
        }
    }
    

      

  • 相关阅读:
    Foundation框架中一些类的使用
    Objective-C知识总结(5)
    Javascript 严格模式详解
    JS-数组冒泡排序
    JS--垒房子
    JS-小球碰撞反弹
    Js制作的文字游戏
    JS产生随机一注彩票
    JS编写背景图切换
    JS编写全选,复选按钮
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/10078161.html
Copyright © 2011-2022 走看看