22 C# 第十八章 TPL 并行编程

这篇博客详细介绍了C#的TPL(Task Parallel Library)并行编程,包括Task线程的基础使用,如创建简单线程和获取返回结果;讨论了Task上的未处理异常情况,如Wait操作可能引发的异常及如何通过ContinueWith处理;探讨了任务的取消机制,并提供了一个实例代码;最后,展示了并行迭代的用法,通过Task.Parallel实现并行处理的示例。
摘要由CSDN通过智能技术生成
C# TPL(Task Parallel Library) 并行编程是.Net4 为多线程编程引入的新的API。因为并行编程涉及到的知识非常广泛,这里只是简单的把.Net 4中TPL的用法总结了一下。

一: Task 线程的基本使用


关于Action委托: 它是 .Net 定义的一种委托类型。
public delegate void Action():  封装一个方法,该方法不具有参数并且不返回值。
public delegate void Action<in T>(T obj):  封装一个方法,该方法只有一个参数并且不返回值。
...  ...


可以使用此委托以参数形式传递方法,而不用显式声明自定义的委托。 封装的方法必须与此委托定义的方法签名相对应。
http://msdn.microsoft.com/zh-cn/library/vstudio/system.action.aspx


光看语言描述理解起来有点费劲。看MSDN给的例子,把自定义的委托和Action比较一下就清楚多了。


两个小例子:

使用委托的例子

using System;
using System.Windows.Forms;


public delegate void ShowValue();


public class Name
{
   private string instanceName;


   public Name(string name)
   {
      this.instanceName = name;
   }


   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }


   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}


public class testTestDelegate
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      ShowValue showMethod = testName.DisplayToWindow;
      showMethod();
   }
}




使用 action的例子

using System;
using System.Windows.Forms;


public class Name
{
   private string instanceName;


   public Name(string name)
   {
      this.instanceName = name;
   }


   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }


   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}


public class testTestDelegate
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      Action showMethod = testName.DisplayToWindow;
      showMethod();
   }
}

这里把Action 看成了一种特殊的委托,没有参数也没有返回值,这样理解起来就简单了。




关于 Task 的简单介绍
更确切的说它是把线程的概念抽象出来了。这里它更关心的是线程中工作的内容。而把创建线程,重用线程或释放线程等平台相关的工作留给了系统。它更贴近与System.Threading.ThreadPool。一个由系统管理的ThreadPool。


使用 Task 创建线程

 一个简单的线程使用的例子

http://msdn.microsoft.com/zh-cn/library/vstudio/1h2f2459.aspx

using System;
using System.Threading;
using System.Threading.Tasks;

class StartNewDemo
{
    static void Main()
    {
        Action<object> action = (object obj) =>
        {
            Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, obj.ToString(), Thread.CurrentThread.ManagedThreadId);
        };

        // Construct an unstarted task
        Task t1 = new Task(action, "alpha");

        // Cosntruct a started task
        Task t2 = Task.Factory.StartNew(action, "beta");

        // Block the main thread to demonstate that t2 is executing
        t2.Wait();

        // Launch t1 
        t1.Start();

        Console.WriteLine("t1 has been launched. (Main Thread={0})", Thread.CurrentThread.ManagedThreadId);

        // Wait for the task to finish.
        // You may optionally provide a timeout interval or a cancellation token
        // to mitigate situations wh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值