并行 多核线程:Task

首先引用System.Threading;

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

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

2:多种方法创建:

  1. using System.Threading.Tasks;
  2. namespace Listing_02
  3. {
  4. class Listing_02
  5. {
  6. static void Main(string[] args)
  7. {

      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");
      }

  1. }
  2. }

3:为创建的Task传入参数

  1. using System;
  2. using System.Threading.Tasks;
  3. namespace Listing_04
  4. {
  5. class Listing_04
  6. {
  7. static void Main(string[] args)
  8. {
  9. string[] messages = { "First task", "Second task",
  10. "Third task", "Fourth task" };
  11. foreach (string msg in messages)
  12. {
  13. Task myTask = new Task(obj => printMessage((string)obj), msg);
  14. myTask.Start();
  15. }
  16. // wait for input before exiting
  17. Console.WriteLine("Main method complete. Press enter to finish.");
  18. Console.ReadLine();
  19. }
  20.  
  21. static void printMessage(string message)
  22. {
  23. Console.WriteLine("Message: {0}", message);
  24. }
  25. }
  26. }

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

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

注意:

  1. foreach (string msg in messages) {
  2. Task MyTask = new Task(() => {
  3. printMessage(msg);
  4. });
  5. MyTask.Start();
  6. }

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

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

可以这样改:

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

带参数的线程中  比如ParameterizedThreadStart可以传一个带参数的变量到线程所调用的方法。注意:方法传入的参数的变量类型元型是object类型的 所以在方法中必须对此类型进行类型显示处理 才能用:

  1. new Thread(new ParameterizedThreadStart(p.go)) { Name="线程1"}.Start();
  2.  
  3. private void go(object obj)
  4. {
  5. int time = Convert.ToInt16(obj);
  6. for (int i = ; i < ; i++)
  7. {
  8. Console.WriteLine(Thread.CurrentThread.Name+" "+i.ToString());
  9. Thread.Sleep(time);
  10. }
  11.  
  12. }

多线程 thread和Task的用法以及注意事项的更多相关文章

  1. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  2. .net 多线程 Thread ThreadPool Task

    先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name">< ...

  3. 异步多线程 Thread ThreadPool Task

    一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...

  4. .NET多线程(Thread,ThreadPool,Task,Async与Await)

    .NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...

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

    说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...

  6. c/c++ 多线程 等待一次性事件 packaged_task用法

    多线程 等待一次性事件 packaged_task用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::asynck可以优雅的搞定一切,一次等待性事件,为什么还有个packaged_tas ...

  7. C# 多线程六之Task(任务)三之任务工厂

    1.知识回顾,简要概述 前面两篇关于Task的随笔,C# 多线程五之Task(任务)一 和 C# 多线程六之Task(任务)二,介绍了关于Task的一些基本的用法,以及一些使用的要点,如果都看懂了,本 ...

  8. C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿![转载]

    说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...

  9. C# Task的用法

    C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...

随机推荐

  1. [MetaHook] BaseUI hook

    Hook IBaseUI function. #include <metahook.h> #include <IBaseUI.h> IBaseUI *g_pBaseUI = ; ...

  2. 2015-2016-2 《Java程序设计》项目小组博客

    2015-2016-2 <Java程序设计>项目小组博客 1451 完+美 java项目 守望先疯 JavaGroup 07_10_20_22 FromBottomToTop L.G.Su ...

  3. CoreBluetooth——IOS蓝牙4.0使用心得

    原文链接:http://m.blog.csdn.net/article/details?plg_nld=1&id=51014318&plg_auth=1&plg_uin=1&a ...

  4. oracle 分组排序函数

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示例和 ...

  5. "本地泛解析"或者叫做”域名劫持泛解析“,做开发二级域名在内网测试

    都不知道怎么称呼这个好,暂且叫 “本地泛解析” 吧 . 大概就是,要做一个二级域对应一个用户的这种功能,类似博客园,我的博客地址是:jerseyblog.cnblogs.com ,你的博客就可能是 x ...

  6. Laravel 安装多国语言包后,phpstorm 还是报错

    问题: 解决办法: vagrant@homestead:~/Code/awbeci$ composer require "overtrue/laravel-lang:~3.0" 总 ...

  7. (译文)MVC通用仓储类

    Generic Repository Pattern MVC Generic Repository Pattern MVC 原文链接:http://www.codeproject.com/Articl ...

  8. Go语言interface详解

    interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服. 什么是interface 简单 ...

  9. Excel For Java

    Excel 需要了解的东西 首先是Excel是一个文件 - File,工作簿 - workbook,sheet - sheet,单元格 - cell. 然后就根据Excel是一个什么东西来创建一个Ex ...

  10. openwrt刷机后配置PPPOE上网方法

    参考下帖13#的方式: 如何编辑配置openwrt,来实现pppoe拨号上网? 但其中有一句代码有错误: option 'peerdns' '0',其中需将‘0’改为‘1’