多线程 thread和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();
}
带参数的线程中 比如ParameterizedThreadStart可以传一个带参数的变量到线程所调用的方法。注意:方法传入的参数的变量类型元型是object类型的 所以在方法中必须对此类型进行类型显示处理 才能用:
new Thread(new ParameterizedThreadStart(p.go)) { Name="线程1"}.Start();
private void go(object obj)
{
int time = Convert.ToInt16(obj);
for (int i = ; i < ; i++)
{
Console.WriteLine(Thread.CurrentThread.Name+" "+i.ToString());
Thread.Sleep(time);
}
}
多线程 thread和Task的用法以及注意事项的更多相关文章
- 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 ...
- .net 多线程 Thread ThreadPool Task
先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name">< ...
- 异步多线程 Thread ThreadPool Task
一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...
- .NET多线程(Thread,ThreadPool,Task,Async与Await)
.NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...
- C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!
说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...
- c/c++ 多线程 等待一次性事件 packaged_task用法
多线程 等待一次性事件 packaged_task用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::asynck可以优雅的搞定一切,一次等待性事件,为什么还有个packaged_tas ...
- C# 多线程六之Task(任务)三之任务工厂
1.知识回顾,简要概述 前面两篇关于Task的随笔,C# 多线程五之Task(任务)一 和 C# 多线程六之Task(任务)二,介绍了关于Task的一些基本的用法,以及一些使用的要点,如果都看懂了,本 ...
- C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿![转载]
说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...
- C# Task的用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
随机推荐
- JAVA JPA - 示例用法
JPA(Java Persistence API)是JSR(Java Specification Requests)的一部分,定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate. ...
- SUBLIME TEXT 2中,光标移入移出括号的快捷键设置
无赖右方向键→和End键都在键盘的另一边,每次输入完一个函数,光标在各种括号中间,有什么更好的方式将光标移出来呢?在Sublime Text 2中,我们可以自己设置快捷键: { "keys& ...
- junit
junit测试代码也视为开发内容的一部分,强烈建议在开发过程中编写junit代码作为开发调试工具,用junit调试代码不需要启动应用服务器,实际上会加快开发速度.
- #CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!
特别声明: 此次并非针对其他参与2013中国十大优秀开源项目的同行,体系有漏洞要谴责的是制定规则并从中获益但不作为的权贵,草根们制定不了规则但可发现和利用漏洞,这是程序员应有反叛精神没错.但被作为道具 ...
- 这些javascript面试题,你做对了几道?
1.---------------------------------------------------- var fun = function(){ this.name = 'peter'; re ...
- <实训|第十天>从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理
[root@localhost~]#序言 我们平时不论是买一个U盘硬盘,或者自己在电脑上创建一个分区,大小总是比我们创建的要小一点,有些人会说,这个正常啊,是因为厂家规定的1M=1000k,真正的是1 ...
- JS运动从入门到兴奋1
hello,我是沐晴,一个充满了才华,却靠了照骗走江湖的前端妹子.在这个充满PS的年代,这你们都信,哈哈,废话不多说,今天要分享的是关注JS运动的知识.楼主一直认为,不管学习什么,核心思想才是王道,掌 ...
- asp.net程序员初涉node.js
之前一直听说node.js在处理网站大规模并发上十分有用,所以有一定规模的公司都在使用node.我在工作中只用过jquery,属于那种边做功能边学习的那一种.甚至连原生的js都不太会写,只是知道语法差 ...
- Overlay network 覆盖网络
From Wikipedia, the free encyclopedia An overlay network is a computer network that is built on top ...
- 【摘抄】将xml注释文档生成网页
config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath(&quo ...