Dot Net FrameWork 4.0 学习笔记(5)

简介:
 新的一年,可能也是新的起点,希望自己能够成长的更快,尽最大全力只为那些我爱的,爱我的人快乐...

    新的一年,也想通了很多事情,放下了看开了,仅仅是她的一句话,引发了我无尽的思考,回首往事,我现
在能更自信,更坚强的面对我的未来...
    
    C# 4.0 的新特性之并行运算
    1.  Parallel.For - for 循环的并行运算  
    2.  Parallel.ForEach - foreach 循环的并行运算  
    3.  Parallel.Invoke - 并行调用多个任务  
    4.  Task - 任务,基于线程池。其使我们对并行编程变得更简单,且不用关心底层是怎么实现的
    5.  PLINQ - 用于对内存中的数据做并行运算,也就是说其只支持 LINQ to Object 的并行运算
    

    1,2 Parallel也是.net 4中最重要更新之一,这也是预示未来的计算趋势,也与网格计算,框计算,甚至是云计算
等等有异曲同工之妙


    private static List<int> list = new List<int>();
    
    static void Main(string[] args)
    {
        InitData();
        Normal();
        ParallelFor();   // 1 parallel.for
        ParallelForeach();  // 2 parallel.foreach
    }


    private static void InitData()
    {
        list.Clear();
        for (int i = 0; i < 20; i++)
        {
            list.Add(i);
        }
    }


    private static void Normal()
    {
        DateTime dt = DateTime.Now;
        Console.WriteLine("普通循环");
        for (int i = 0; i < 20; i++)
        {
            GetData(i);
        }


        Console.WriteLine("消耗时间为:" + (DateTime.Now - dt).TotalSeconds + "秒");
        Console.WriteLine();
    }


    private static void ParallelFor()
    {
        DateTime dt = DateTime.Now;
        Console.WriteLine("并行for");
        System.Threading.Tasks.Parallel.For(0, 20, (i) => { GetData(i); });
        Console.WriteLine("消耗时间为:" + (DateTime.Now - dt).TotalSeconds + "秒");
        Console.WriteLine();
    }


    private static void ParallelForeach()
    {
        DateTime dt = DateTime.Now;
        Console.WriteLine("并行foreach");
        System.Threading.Tasks.Parallel.ForEach(list, (i) => { GetData(i); });
        Console.WriteLine("消耗时间为:" + (DateTime.Now - dt).TotalSeconds + "秒");
        Console.WriteLine();
    }


    static int GetData(int i)
    {
        System.Threading.Thread.Sleep(100);
        Console.Write(i.ToString()+"\t");
        return i;
    }


     Dot Net FrameWork 4.0 学习笔记(5) - 無牽℡↘嘸褂 - 菁华隐没℡↘芳流歇绝
 

    3. parallel.Invoke 并行调用,在同一瞬间利用处理器的多线程机制,同时触发执行每个操作,

当然在这之前,你首先要保证你的每个操作具备原子性特点.(若操作之间有并发数据问题)


    var tasks = new Action[] { () => Task1(), () => Task2(), () => Task3() };



    // System.Threading.Tasks.Parallel.Invoke - 并行调用多个任务
    System.Threading.Tasks.Parallel.Invoke(tasks);
    

     Dot Net FrameWork 4.0 学习笔记(5) - 無牽℡↘嘸褂 - 菁华隐没℡↘芳流歇绝



    4. Task



    /*

     * CancellationTokenSource - 取消任务的操作需要用到的一个类
     *     Token - 一个 CancellationToken 类型的对象,用于通知取消指定的操作
     *     IsCancellationRequested - 是否收到了取消操作的请求
     *     Cancel() - 结束任务的执行
     * ParallelOptions - 并行运算选项
     *     CancellationToken - 设置一个 Token,用于取消任务时的相关操作
     *     MaxDegreeOfParallelism - 指定一个并行循环最多可以使用多少个线程
     */
    CancellationTokenSource cts = new CancellationTokenSource();
    ParallelOptions pOption = new ParallelOptions() { CancellationToken = cts.Token };
    pOption.MaxDegreeOfParallelism = 10;


    Console.WriteLine("开始执行,2.0 秒后结束");


    /*
     * Task - 任务类
     *     Factory.StartNew() - 创建并开始一个或一批新任务
     *     ContinueWith() - 此任务完成后执行指定的另一个任务
     *     AsyncState - 此任务的上下文对象
     *     Wait() - 阻塞,直到任务完成
     */
    Task task0 = Task.Factory.StartNew(() =>
    {
        Thread.Sleep(2000);
        cts.Cancel();
        Console.WriteLine("结束");
    });


    var tasks = new Action[] { () => Task1(), () => Task2() };

    // 利用第三知识点,再传入并行任务操作选项

    System.Threading.Tasks.Parallel.Invoke(pOption,tasks);


    private static void Task1(CancellationToken token)
    {
        // 每隔 1 秒执行一次,直到此任务收到了取消的请求
        // 注意:虽然此处是其他线程要向主线程(UI线程)上输出信息,但因为使用了 Task ,所以不用做任何处理
        while (!token.IsCancellationRequested)
        {
            Console.WriteLine("Task1 - " + "当前线程ID: " + Thread.CurrentThread.ManagedThreadId.ToString());
            Thread.Sleep(1000);
        }
    }


    private static void Task2(CancellationToken token)
    {
        while (!token.IsCancellationRequested)
        {
            Console.WriteLine("Task2 - " + "当前线程ID: " + Thread.CurrentThread.ManagedThreadId.ToString());
            Thread.Sleep(1000);
        }
    }


    /*

     * 一个 Task 内可以包含多个 Task
       Task tasks = new Task(() => 
       {
            Task.Factory.StartNew(() => Method()); 
            Task.Factory.StartNew(() => Method2()); 
            Task.Factory.StartNew(() => Method3()); 
        }); 
        tasks.Start(); 
        // 阻塞,直到整个任务完成
        tasks.Wait(); 
     */


    5. PLINQ LINQ to Object的并行计算方式

    
    // AsParallel() - 并行运算

    // AsSequential() - 串行运算
    // AsOrdered() - 保持数据的原有顺序(AsSequential()指的是串行运算;AsOrdered()指的是如果在并行运算的前提下,它会把结果先缓存,然后排序,最后再把排序后的数据做输出)
    // AsUnordered() - 可以不必保持数据的原有顺序
    // WithDegreeOfParallelism() - 明确地指出需要使用多少个线程来完成工作
    // WithCancellation(new CancellationTokenSource().Token) - 指定一个 CancellationToken 类型的参数
    实例:

       ParallelQuery nums = from num in list.AsParallel<int>().AsOrdered<int>()
                                 where num % 10 == 0
                                 select num;
    比较强大的linq并行计算方式,甚至用于聚合函数的并行都也是可以的.

       list.AsParallel().Average().ToString()

    当然一个前提就是以上的并行计算拓展方法肯定是不能用在顺序计算当中的..    Dot Net FrameWork 4.0 学习笔记(5) - 無牽℡↘嘸褂 - 菁华隐没℡↘芳流歇绝



    下节知识点 ado.net data service(WCF Data Service)



    

     本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360548,如需转载请自行联系原作者




相关文章
|
3月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
790 2
|
6月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
928 3
|
3月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
846 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
4月前
|
C++
提示缺少.NET Framework 3.5 安装错误:0x80070002、0x800F0950\0x80004002
.NET Framework常见问题及解决方法汇总,
633 0
|
6月前
|
C++ Windows
WindowsDLL修复专家,MSVCP**、DLL修复vcruntime**、DLL修复、`.Net Framework`缺失、DirectX类DLL修复、VC运行库修复
Windows DLL修复专家是一款专为解决因DLL文件缺失、版本错误导致的软件或游戏无法运行问题的系统工具。它支持一键扫描和修复各类DLL异常,涵盖MSVCP、vcruntime、.NET Framework、DirectX等多种常见问题。具备自动检测、备份还原功能,确保修复过程安全可靠。适用于软件报错、系统异常及新系统适配场景,降低用户手动修复门槛,提升系统稳定性与兼容性。
256 3
|
5月前
.NET Framework 3.5离线安装包合集下载
本文介绍了如何获取和安装.NET Framework运行库离线合集包。用户可通过提供的链接下载安装包,安装过程简单,按提示逐步操作即可完成。安装时可选择所需版本,工具会自动适配架构,无需手动判断,方便高效。
4378 0
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
197 1
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
224 3
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
664 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation