一. Task开启多线程的三种形式

 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托。

2. 利用Task.Run()开启多线程,能向其中传递无参数的委托,有参数的可以使用  Task.Run(()=>{   TestThread("ypf")  })这种形式。(推荐这种方式,最简洁。)

3. 先实例化Task,然后调用Start方法进行线程的开启。 Task构造函数可以无参委托或无参委托+object类型参数。   (同样道理,无参委托赋值有参函数,可以用之前的方案解决)

      public static void Test4()
{
//一. 各种委托的赋值
//1. 无参数委托(包括方法有参数,如何赋值给无参委托)
Action act1 = TestThread3;
Action act2 = () => TestThread2("测试参数1");
Action act3 = () => TestThread("测试参数1", "测试参数2"); //2. 和方法参数对应的委托
Action act4 = () => TestThread3();
Action<string> act5 = t => TestThread2(t);
Action<string, string> act6 = (m, n) => TestThread(m, n); //3. Action<object>委托
Action<object> act7 = t => TestThread3();
Action<object> act8 = t => TestThread2(t.ToString());
//多个参数的函数要用实例类的方法解决 //4. 委托赋值时不传参数,调用的时候传递
Action act9 = TestThread3;
Action<string> act10 = TestThread2;
Action<string, string> act11 = TestThread; //二. TaskFactory多线程的几种情况
TaskFactory taskFactory = new TaskFactory();
//1. 调用无参委托不需要传递参数
//{
// taskFactory.StartNew(act1);
// taskFactory.StartNew(act2);
// taskFactory.StartNew(act3);
//} //2. 调用和方法参数对应的委托,需要在调用的时候传递参数
//{
// taskFactory.StartNew(act4);
// taskFactory.StartNew(act5, "测试参数1"); //不支持(StartNew没有这种重载)
// taskFactory.StartNew(act6, "测试参数1", "测试参数2"); //不支持(StartNew没有这种重载)
//} //3. 调用Action<object>委托
//{
// taskFactory.StartNew(act7,"");
// taskFactory.StartNew(act8, "测试参数1");
//} //4. 调用 委托赋值时不传参数,调用的时候传递
//{
// taskFactory.StartNew(act9);
// taskFactory.StartNew(act10, "测试参数1"); //不支持(StartNew没有这种重载)
// taskFactory.StartNew(act11, "测试参数1", "测试参数2"); //不支持(StartNew没有这种重载)
//} //三. 使用Task.Run() 多线程的几种情况
//1. 调用无参委托不需要传递参数
//{
// Task.Run(act1);
// Task.Run(act2);
// Task.Run(act3);
// Task.Run(act4);
// Task.Run(act9);
//}
//除了上述五种方式,其他均不支持 //四. 利用Task实例下的Start方法开启多线程
//1.act1 act2 act3 act4 act9 调用无参委托不需要传递参数,均可以调用
//{
// Task task = new Task(act9);
// task.Start();
//}
//2. Action<object>委托可以使用
//act7和act8可以调用
{
Task task = new Task(act7, "");
task.Start();
}
{
Task task = new Task(act8, "测试参数1");
task.Start();
} }

二. 线程等待的两种形式

1. 利用Task下的静态方法WaitAll和WaitAny,来进行线程等待。(如果是主线程执行,则卡主主线程,如果新建一个子线程执行,则卡主了子线程)

2. 利用TaskFactory下的ContinueWhenAny和ContinueWhenAll,来进行线程等待。

三. Parallel并行计算

1. 并行计算和多线程的区别:

多线程:如果要线程等待,需要单独开辟一个线程来进行线程等待,主线程在那等着。

并行计算:开启多个线程,默认就是线程等待,主线程在那等着,所以会卡主线程。

2. 并行计算的三种形式

Parallel.Invoke();

Parallel.For();

Parallel.ForEach()

      private void button6_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("----------------- 七.并行运算Parallel --------------------------");
Console.WriteLine("----------------- button1_Click 开始 主线程id为:{0} --------------------------", Thread.CurrentThread.ManagedThreadId); //下面的测试结果发现,主线程均被卡住
//并行计算和多线程相比的区别: 多线程执行后,需要单独再开辟一个线程等待,然后主线程在执行。 而并行计算,开启多个线程后,不需要再开辟线程等待,直接是主线程完成后续操作 #region 写法一
//{
// Parallel.Invoke(() => this.TestThread("bct1")
// , () => this.TestThread("bct2")
// , () => this.TestThread("bct3")
// , () => this.TestThread("bct4")
// , () => this.TestThread("bct5")
// );
//}
#endregion #region 写法二
//{
// //前两个参数之间的差,就为并行计算线程的个数
// Parallel.For(5, 10, t =>
// {
// //这里的t分别为:5,6,7,8,9 五个数
// string name = string.Format("bct{0}", t);
// this.TestThread(name);
// });
//}
#endregion #region 写法三
//{
// //数组里的个数,就为并行计算线程的个数
// Parallel.ForEach(new int[] { 3, 5, 44, 55, 100 }, t =>
// {
// //这里的t分别为:3, 5, 44, 55, 100五个数
// string name = string.Format("bct{0}", t);
// this.TestThread(name);
// });
//}
#endregion #region 写法四
{
ParallelOptions po = new ParallelOptions()
{
MaxDegreeOfParallelism = //表示最大线程数为5,后面即使配置超过5,也无效
};
Parallel.For(, , po, (t, state) =>
{
string name = string.Format("bct{0}", t);
this.TestThread(name);
//state.Break(); //退出单次循环(没看到实际作用)
// state.Stop(); //退出全部循环(没看到实际作用)
//return;
});
}
#endregion watch.Stop();
Console.WriteLine("----------------- button1_Click 结束 主线程id为:{0} 总耗时:{1}--------------------------", Thread.CurrentThread.ManagedThreadId, watch.ElapsedMilliseconds); }

.Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)的更多相关文章

  1. .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)

    一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...

  2. .Net进阶系列(10)-异步多线程综述(被替换)

    一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...

  3. .Net进阶系列(15)-异步多线程(线程的特殊处理和深究委托赋值)(被替换)

    1. 线程的异常处理 我们经常会遇到一个场景,开启了多个线程,其中一个线程报错,导致整个程序崩溃.这并不是我们想要的,我需要的结果是,其中一个线程报错,默默的记录下,其它线程正常进行,保证程序整体可以 ...

  4. .Net进阶系列(14)-异步多线程(async和await)(被替换)

    1.  方法名前只有async,但是方法中Task实例前没有await关键字,该方法和普通方法没有什么区别,但是会报一个警告. #region 情况一 /// <summary> /// ...

  5. .Net进阶系列(12)-异步多线程(Thread和ThreadPool)(被替换)

    一. Thread多线程   1. 两种使用方式 通过F12查看Thread后,发现有两类构造函数,ParameterizedThreadStart和ThreadStart,其中 ThreadStar ...

  6. 异步多线程 Task理解

    一.简介 Task是.NET Framework4.0 TPL(任务并行库)提供的新的操作线程池线程的封装类.它提供等待.终止(取消).返回值.完成通知.失败通知.控制执行的先后次序等优化线程操作功能 ...

  7. SilkTest高级进阶系列9 – 异步执行命令

    我们常常会使用sys_execute函数执行一些外部的程序或者命令来做一些事情,但是由于sys_execute是一个同步的函数,它会等待执行的命令完成后才会返回.在大多数情况下,这个函数足够用了. 但 ...

  8. .Net进阶系列(4)-Lambda和linq入门(被替换)

    一. Lambda和linq入门 lambda表达式又叫点标记,linq表达式又叫查询表达式,下面有三个简单的案例说明一下二者的基本用法,详细用法会在后续章节中更新. 二. 事例 1. 准备学生信息. ...

  9. .NET 异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消

    今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...

随机推荐

  1. JsTree使用一例

    SearchDesignPatent.treeContainer().jstree({ 'core' : { 'data' : json.data }, }).bind('click.jstree', ...

  2. Selenium的自我总结2_元素基本操作

    对于Selenium的基本元素的操作,就自己的了解做了一个基本的介绍,这篇直接上代码,针对一个页面如何操作写了些基本的操作脚本,希望对初学者有一定的帮助,也希望通过这些总结让自己有一些清晰的认识和了解 ...

  3. Appium学习笔记3_Genymotion模拟器安装

    如果你已经配置好了安卓的运行环境,也配置好了自带的模拟器AVD,而且也launch了你的安卓模拟器,那么我相信你是不再愿意launch安卓模拟器第二次了,因为实在是太卡了(当然如果你电脑的配置够高,你 ...

  4. cordic

    cordic里向量旋转得到新向量,利用的是旋转矩阵 摘自百度百科维基百科 旋转矩阵(Rotation matrix)是在乘以一个向量的时候改变向量的方向但不改变大小的效果的矩阵.旋转矩阵不包括反演,它 ...

  5. Django-website 程序案例系列-4 ORM数据库操作

    数据库表的创建: 使用mysql时注意,在setting.py中的设置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' ...

  6. Uva10474-STL水题-白书

    白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> ...

  7. Java OOM 常见情况

    Java OOM 常见情况 原文:https://blog.csdn.net/qq_42447950/article/details/81435080 1)什么是OOM?  OOM,全称“Out Of ...

  8. windows上搭建nginx

    命令 相关命令(需定位到所在目录):安装:start nginx.exe 停止运行:nginx.exe -s stop 或在进程找到nginx.exe结束重启:nginx.exe -s reload ...

  9. 自学Linux Shell12.6-嵌套循环for命令

    点击返回 自学Linux命令行与Shell脚本之路 12.6-嵌套循环for命令 嵌套循环就是在一个循环中还有一个循环. 内部循环在外部循环体中,在外部循环的每次执行过程中都会触发内部循环,直到内部循 ...

  10. 【BZOJ2142】礼物(拓展卢卡斯定理)

    [BZOJ2142]礼物(拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 显然如果\(\sum w_i>n\)无解. 否则答案就是:\(\displaystyle \prod_{i=1}^m{n- ...