码迷,mamicode.com
首页 > 其他好文 > 详细

Task的用法

时间:2015-07-30 13:08:48      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

并行 多核线程:Task

首先引用System.Threading;

1:用静态方法:Task.Factory.StartNew()来创建了一个最简单的Task:

Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Hello World");
            });

2:多种方法创建:

using System.Threading.Tasks;
namespace Listing_02
{
    class Listing_02
    {
        static void Main(string[] args)
        {

      Task t = new Task(new Action(write));
      Task t = new Task(delegate { Console.WriteLine("a"); });
      Task t = new Task(() => { Console.WriteLine("a"); });
      Task t = new Task(() => { write(); });
      Task t = new Task(delegate(){ write(); });
      t.Start();
      Console.ReadLine();
      }
      private static void write()
      {
        Console.WriteLine("aynm");
      }

    }
}

3:为创建的Task传入参数

using System;
using System.Threading.Tasks;
namespace Listing_04
{
    class Listing_04
    {
        static void Main(string[] args)
        {
            string[] messages = { "First task", "Second task",
"Third task", "Fourth task" };
            foreach (string msg in messages)
            {
                Task myTask = new Task(obj => printMessage((string)obj), msg);
                myTask.Start();
            }
            // wait for input before exiting
            Console.WriteLine("Main method complete. Press enter to finish.");
            Console.ReadLine();
        }

        static void printMessage(string message)
        {
            Console.WriteLine("Message: {0}", message);
        }
    }
}

注意:我们在传入参数后,必须把参数转换为它们原来的类型,然后再去调用相应的方法。例子中,因为System.Action对应的方法是printMessage()方法,而这个方法的要求的参数类型是string,所以要转换为string。

  想向Task传入参素,只能用System.Action<object>

注意:

foreach (string msg in messages) {
            Task MyTask = new Task(() => {
                printMessage(msg);
            });
            MyTask.Start();
        }

这样写是不正确的,这样会导致延迟加载,得不到预期的结果。

 原因:因为旧版本对“闭包”变量的处理 导致这样。

可以这样改:


foreach (string msg in messages)
{
string a = msg; 
Task myTask
= new Task(() => { printMessage(a); });
MyTask.Start();
}

 

Task的用法

标签:

原文地址:http://www.cnblogs.com/zhayunjia/p/4688931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!