zoukankan      html  css  js  c++  java
  • 多线程、异步、同步的简单示例

    花了半天整理了多线程、异步、同步相关的几个对象

    Thread 
    创建一个线程进行多线程工作
    Thread t new Thread(new ThreadStart(() => { Console.WriteLine("T"); }));
    t.Start();
    
    ThreadPool
    把线程托管到.NET线程池中,减少了线程创建的开销
    ThreadPool.QueueUserWorkItem((objState) => { Console.WriteLine(objState.ToString()); }, "a");
    
    BackgroundWorker 
    把线程托管到内部线程池,并且提供了信息进度反馈的能力
    BackgroundWorker b new BackgroundWorker();
    b.WorkerReportsProgress true;
    b.DoWork += (s, e) => {
        for (int i = 1; i < 100; i++)
        {
            b.ReportProgress(i);
            Thread.Sleep(100);
        }
    };
    b.ProgressChanged += (s, e) => { Console.WriteLine(e.ProgressPercentage.ToString()); };
    b.RunWorkerAsync();
    
    Task
    增强了ThreadPool的能力,支持线程停止,状态返回、线程等待
    CancellationTokenSource cts new CancellationTokenSource();
    Task t new Task((ct) =>
    {
        while (!((CancellationTokenSource)ct).IsCancellationRequested)
        {
            Console.WriteLine(DateTime.Now.ToString());
            Thread.Sleep(200);
        }
        return;
    },cts);
    Console.WriteLine("Begin");
    t.Start();
    t.ContinueWith((s) =>
    {
        Console.WriteLine("End");
    });
    //await a.ConfigureAwait(false);//支持线程等待
    Console.Read();
    cts.Cancel();
    Console.Read();
    
    Parallel
    简化同步状态下Task的使用,多余多个任务同步状态下并行执行提供帮助
    List<int> nums = new List<int>() { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    Parallel.ForEach(nums, (i) => { Console.WriteLine(i.ToString()); });
    
    Parallel.Invoke(() =>
    {
        Console.WriteLine("Begin");
        Thread.Sleep(2000);
        Console.WriteLine("End");
    },
    () =>{
        Console.WriteLine("Begin");
        Thread.Sleep(2000);
        Console.WriteLine("End");
    });
    
    PLinq
    Parallel方式在Linq下的实现
    List<int> nums = new List<int>() { 12345678910111213141516 };
    nums.AsParallel().ForAll((x) => { Console.WriteLine(x.ToString()); });
    
    async  await
    用同步的编程方式编写异步代码,主要用于解决一部代码编写代码臃肿的情况,异步执行的Task被他用await等待同步执行
    public async static void  AA()
    {
        for (int i = 0; i < 100; i++)
        {
            int i2 = await Sleep(i);
            Console.WriteLine(i.ToString());
        }
    }
     
    public static Task<int> Sleep(int i)
    {
        var t= new Task<int>(() =>
        {
            Thread.Sleep(1000);
            return i * i;
        });
        t.Start();
        return t;
    }
  • 相关阅读:
    ZYNQ xilinx之困惑
    位操作的宏函数实现
    BCG信号的检测【时时更新】
    课题兼申请任务Freescale的K60系列
    SDRAM之持续中。。。。。。
    几款常见的免费网站程序
    常用运放选型
    SDRAM之开始burst length
    谈 数学之美 和 看见
    C语言中的可变参数(...)
  • 原文地址:https://www.cnblogs.com/CR-Soft/p/3195714.html
Copyright © 2011-2022 走看看