zoukankan      html  css  js  c++  java
  • 【转】编写高质量代码改善C#程序的157个建议——建议82:Parallel简化但不等同于Task默认行为

    建议82:Parallel简化但不等同于Task默认行为

    建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用。也就是说,在运行Parallel中的For、ForEach方法时,调用者线程(在示例中就是主线程)是被阻滞的。Parallel虽然将任务交给Task去处理,即交给CLR线程池去处理,不过调用者会一直等到线程池中的相关工作全部完成。表示并行的静态类Parallel甚至只提供了Invoke方法,而没有同时提供一个BeginInvoke方法,这也从一定程度上说明了这个问题。

    在使用Task时,我们最常使用的是Start方法(Task也提供了RunSynchronously),它不会阻滞调用者线程。如下所示:

    static void Main()  
    {  
        Task t = new Task(() =>
            {  
                while (true)  
                {  
     
                }  
            });  
        t.Start();  
        Console.WriteLine("主线程即将结束");  
        Console.ReadKey();  
    } 

    输出为:
    主线程即将结束


    使用Parallel执行相近的功能,主线程被阻滞:

    static void Main()  
    {  
      //在这里也可以使用Invoke方法  
        Parallel.For(0, 1, (i) =>
            {  
                while (true)  
                {  
     
                }  
            });  
        Console.WriteLine("主线程即将结束");  
        Console.ReadKey();  
    } 

    如果执行这段代码,永远不会有输出。

    并行编程,意味着运行时在后台将任务分配到尽量多的CPU上,虽然它在后台使用Task进行管理,但这并不意味着它等同于异步。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    display、box-sizing,position有哪些值?
    css伪类与伪元素
    HTML基础(一)——一般标签、常用标签和表格
    C#处理猜拳问题(非窗体)
    C#语言基础——结构体和枚举类型
    C#语言基础-类——string增加内容
    C#解决验证码问题
    C#ArrayList集合——小例题
    C#语言基础——特殊集合
    http请求访问响应慢问题解决的基本思路
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7993807.html
Copyright © 2011-2022 走看看