Task的用法

并行 多核线程: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();
}
时间: 2024-10-24 01:44:33

Task的用法的相关文章

verilog中task的用法

任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要它处理某些数据并返回操作结果,所以任务应当有接收数据的输入端和返回数据的输出端.另外,任务可以彼此调用,而且任务内还可以调用函数.  1.任务定义 任务定义的形式如下: task task_id;     [declaration]     procedural_statement endtask 

C# task用法

C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下,配合CancellationTokenSource类更为可以轻松的对Task操作的代码进行中途终止运行. 创建Task 创建Task有两种方式,一种是使用构造函数创建,另一种是使用 Task.Factory.StartNew 进行创建.如下代码所示 1.使用构造函数创建Task  Task t1 =

C# Task 用法

转自原文 C# Task 用法 C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下,配合CancellationTokenSource类更为可以轻松的对Task操作的代码进行中途终止运行,会在后面的章节中讲述. 如果我们使用线程池来实现某几个方法运行,然后等待运行完成的大概会编写如下代码: using (ManualResetEvent m1 = n

c#, Task用法说明

1. C# Task 的用法 http://www.wxzzz.com/683.html C# 多线程的自动管理(线程池) http://www.cnblogs.com/SkySoot/archive/2012/04/01/2429259.html .Net项目分层与文件夹结构大全 http://www.wxzzz.com/1354.html

多线程系列(3)任务Task

虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章我从以下几点对Task进行总结. 认识Task Task的用法 认识Task Task类在命名空间System.Threading.Tasks下,通过Task的Factory返回TaskFactory类,以TaskFactory.StartNew(Action)方法可以创建一个新的异步线程,所创建的

C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!

说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行:对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会阻塞,可以继续往下执行:等到后台线程执行完毕,再通知主线程,然后做出对应操作! 在C#中开启新线程比较简单 static void Main(string[]

认识Task和Task的基本使用(转)

对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于"任务的编程模型"所冲击,因为task会比thread具有更小的性能开销,不过大家肯定会有疑惑,任务和线程到底有什么区别呢?  任务和线程的区别: 1.任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行. 2.任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比

C#并行和多线程编程 3——认识和使用Task

对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于"任务的编程模型"所冲击,因为task会比thread具有更小的性能开销,不过大家肯定会有疑惑,任务和线程到底有什么区别呢?  任务和线程的区别: 1.任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行. 2.任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比

5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task

对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为task会比thread具有更小的性能开销,不过大家肯定会有疑惑,任务和线程到底有什么区别呢?  任务和线程的区别: 1.任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行. 2.任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很