.NET4.0新功能:任务(Task)

  用过.NET线程池的程序员都知道通过调用ThreadPool类的QueueUserWorkItem方法把要执行的代码放入线程池去执行。由于.NET FCL的强大,使得这个操作极其简便。但使用线程池有个明显的不足之处,那就是我们无法获取线程池执行方法的返回值,因为WaitCallback委托的返回值为void。注:WaitCallback委托的原型为:public delegate void WaitCallback(Object state)。

  比如,我们有个方法代码是这样的:

public   int  Sum()
{
    
// 此方法模拟一个耗时操作
     int  sum  =   0 ;
    
for  ( int  num  =   1 ; num  <=   100 ; num ++ )
    {
       Thread.Sleep(
5 );
       sum 
+=  num;
    }
    return sum;

}

  假如这个方法可以加入线程池中去执行(实际上不能,因为不匹配WaitCallback委托),但我们也无法获取执行的结果。随着.NET4.0的发布,这个问题得到了解决,.NET 4.0提供了一个新功能,叫任务(Task),在System.Threading.Task命名空间下,有个Task类及其泛型版本Task<TResult>。我们可以把这个方法添加到任务,并可以获得执行结果,示意代码如下:

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

namespace  TaskDemo
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            Task
< int >  task  =   new  Task < int > (()  =>  Sum());//新建任务实例       
            task.Start();//开始任务
            Console.WriteLine(
" 任务已开始 " );
            task.Wait();//等待任务执行完成
            Console.WriteLine(task.Result);
        }
     //此方法模拟一个耗时操作
         static   int  Sum()
        {
            Console.WriteLine(
" 任务正在执行 " );
            
int  sum  =   0 ;
            
for  ( int  num  =   1 ; num  <=   100 ; num ++ )
            {
                Thread.Sleep(
5 );
                sum 
+=  num;
            }
            
return  sum;
        }
    }
}

  任务(Task)确实是个好东东!这里只对任务(Task)作个初步的介绍。由于我也只是刚接触,感觉这是个非常有用的功能,于是忍不住就写出来了,由于笔者水平有限,不足之处还望高手指点。

  最后,非常感谢Jeffrey Richter给我们带来的惊喜--《CLR via C#, Third Edition》。

  

  参考文献:《CLR via C#, Third Edition》,作者:Jeffrey Richter。

 

你可能感兴趣的:(.net)