多核时代 .NET Framework 4 中的并行编程2---任务并行库之Task (上)

简介:

.     任务并行库

任务并行库 (Task Parallel Library) 是 .NET Framework 4 版的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API。 TPL 的目的在于简化向应用程序中添加并行性和并发性的过程,从而提高开发人员的工作效率。TPL 会动态地按比例调节并发程度,以便最有效地使用所有可用的处理器。 此外,TPL 还处理工作分区、ThreadPool 上的线程调度、取消支持、状态管理以及其他低级别的细节操作。 通过使用 TPL,您可以在将精力集中于程序要完成的工作,同时最大程度地提高代码的性能。

 .NET Framework 4 开始,TPL 是编写多线程代码和并行代码的首选方法。 但是,并不是所有代码都适合并行化;例如,如果某个循环在每次迭代时只执行少量工作,或它在很多次迭代时都不运行,那么并行化的开销可能导致代码运行更慢。 此外,像任何多线程代码一样,并行化会增加程序执行的复杂性。 尽管 TPL 简化了多线程方案,但我们建议您对线程处理概念(例如,锁、死锁和争用条件)进行基本的了解,以便能够有效地使用 TPL。

下面,将介绍并行库中一个重要的类:Task.它表示一个异步操作.

2.     Task基本使用:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace AppParallel

{

    class Program

    {

        static void Main(string[] args)

        {

            Task task1 = new Task(new Action(SayHello));

 

            Task task2 = new Task(delegate

                {

                    SayHello();

                });

            Task task3 = new Task(() => SayHello());

 

            Task task4 = new Task(() =>

            {

                SayHello();

            });

            task1.Start();

            task2.Start();

            task3.Start();

            task4.Start();

           

            Console.WriteLine("Main 执行完毕!");

            Console.ReadLine();

 

        }

 

        static void SayHello()

        {

            Console.WriteLine("Hello C# Parallel!");

        }

    }

}

 

上面的例子中,我们首先需要引用System.Threading.Tasks名空间,这个命名空间是.Net4中新增加的.同时,我们可以编写并行代码很简单,需要申明一个Task的实例,然后调用他的Start()方法即可.

Task类的提供以下构造函数:

(1)           Task(Action) 

使用指定的操作初始化新的 Task。  

(2)           Task(Action, CancellationToken) 

用指定的操作和 CancellationToken 初始化新的 Task 

(3)           Task(Action, TaskCreationOptions) 

使用指定的操作和创建选项初始化新的 Task 

(4)           Task(Action<Object>, Object) 

使用指定的操作和状态初始化新的 Task 

(5)           Task(Action, CancellationToken, TaskCreationOptions) 

使用指定的操作和创建选项初始化新的 Task

(6)           Task(Action<Object>, Object, CancellationToken) 

使用指定的操作、状态和选项初始化新的 Task 

(7)           Task(Action<Object>, Object, TaskCreationOptions) 

使用指定的操作、状态和选项初始化新的 Task 

(8)           Task(Action<Object>, Object, CancellationToken, TaskCreationOptions) 

使用指定的操作、状态和选项初始化新的 Task

其中,TaskCreationOptions用来指定可控制任务的创建和执行的可选行为的标志。可用的枚举如下:

Ø None 指定应使用默认行为。 

Ø PreferFairness 提示 TaskScheduler 以一种尽可能公平的方式安排任务,这意味着较早安排的任务将更可能较早运行,而较晚安排运行的任务将更可能较晚运行。 

Ø LongRunning 指定某个任务将是运行时间长、粗粒度的操作。 它会向TaskScheduler 提示,过度订阅可能是合理的。 

Ø AttachedToParent 指定将任务附加到任务层次结构中的某个父级。 

3.     传入参数

编写代码传递参数是常见的,那么在Task中如何将参数传入在执行的代码中呢?此时,我们需要使用Task的Task(Action<Object>, Object)这个构造函数.例子如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

namespace AppParallel

{

    class Program

    {

        static void Main(string[] args)

        {

            Task task1 = new Task(new Action<object>(DisplayTime),DateTime.Now);

 

            Task task2 = new Task(delegate(object obj)

                {

                    DisplayTime(obj);

                }, DateTime.Now);

 

            Task task3 = new Task((obj) => DisplayTime(obj),DateTime.Now);

 

            Task task4 = new Task((obj) =>

            {

                DisplayTime(obj);

            }, DateTime.Now);

 

            task1.Start();

            task2.Start();

            task3.Start();

            task4.Start();

 

            Console.WriteLine("执行完毕!");

            Console.ReadLine();

 

        }

 

        static void DisplayTime(object dt)

        {

            Console.WriteLine("现在时间是:" + ((DateTime)dt).ToLocalTime());

        }

    }

}

 

4.     返回结果

我们可以通过Task<T>实例的Result来获取代码执行的返回结果,其中T表示返回结果的类型,例子:

 static void Main(string[] args)

 {

 

           Task<bool> t = new Task<bool>(Contains, "xzdf2a");

            t.Start();

            Console.WriteLine("Main执行完毕!");

            Console.WriteLine("Task返回的结果:" + t.Result.ToString());

            Console.ReadLine();

 }

static bool Contains(object obj)

    {

            string s = obj as string;

            if (s != null)

            {

                return s.Contains('a');

            }

            return false;

 }

 


    本文转自风车车  博客园博客,原文链接:http://www.cnblogs.com/xray2005/archive/2011/08/21/2147625.html,如需转载请自行联系原作者



相关文章
|
2天前
|
传感器 数据采集 物联网
探索.NET nanoFramework:为嵌入式设备编程的新途径
探索.NET nanoFramework:为嵌入式设备编程的新途
11 7
|
8天前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
13天前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
48 8
|
14天前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
2天前
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。
|
2月前
|
大数据 开发工具 开发者
从零到英雄:.NET核心技术带你踏上编程之旅,构建首个应用,开启你的数字世界探险!
【8月更文挑战第28天】本文带领读者从零开始,使用强大的.NET平台搭建首个控制台应用。无论你是新手还是希望扩展技能的开发者,都能通过本文逐步掌握.NET的核心技术。从环境搭建到创建项目,再到编写和运行代码,详细步骤助你轻松上手。通过计算两数之和的小项目,你不仅能快速入门,还能为未来开发更复杂的应用奠定基础。希望本文为你的.NET学习之旅开启新篇章!
32 1
|
2月前
|
Unix Linux C#
增强用户体验:2个功能强大的.NET控制台应用帮助库
增强用户体验:2个功能强大的.NET控制台应用帮助库
|
2月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
79 7
|
2月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
33 0
|
2月前
|
传感器 数据采集 物联网
探索未来:.NET nanoFramework引领嵌入式设备编程革新之旅
【8月更文挑战第28天】.NET nanoFramework 是一款专为资源受限的嵌入式设备设计的轻量级、高性能框架,基于 .NET Core,采用 C# 进行开发,简化了传统底层硬件操作的复杂性,极大提升了开发效率。开发者可通过 Visual Studio 或 Visual Studio Code 快速搭建环境并创建项目,利用丰富的库和驱动程序轻松实现从基础 LED 控制到网络通信等多种功能,显著降低了嵌入式开发的门槛。
46 0