参考

一、异步委托开启线程

  Action<int, int> a = add;
a.BeginInvoke(, , null, null);//前两个是add方法的参数,后两个可以为空
Console.WriteLine("main()");
Console.ReadKey(); static void add(int a, int b)
{
Console.WriteLine(a + b);
}

如果不是开启线程,像平常一样调用的话,应该先输出7,再输出main()

二、通过thread类开启线程

            new Thread(() =>
{
DTTEST();
})
{ IsBackground = true }.Start();
new Thread(() =>
{
DTTEST();
})
{ IsBackground = true }.Start();
new Thread(() =>
{
DTTEST();
})
{ IsBackground = true }.Start(); Thread.Sleep(); static private void DTTEST()
{ Console.WriteLine($"测试并行调用{DateTime.Now}");
}

或者

            Thread thread = new Thread(() =>
{
while (true)
{
Thread.Sleep();
DTTEST();
}
});
thread.Start();

三、通过线程池开启线程

            var param = "哈哈";
ThreadPool.QueueUserWorkItem(obj =>
{
// DTTEST(param);
CallbackDemoViod(obj);
}, param);
ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
}); private static void CallbackDemoViod(object obj)
{
//以下不catch异常就会导致闪退
try
{
Console.WriteLine(obj.ToString());
}
catch (Exception ex)
{ Console.WriteLine(ex);
} }
static private void DTTEST(string a)
{
try
{
Console.WriteLine(a);
}
catch (Exception ex)
{ Console.WriteLine(ex);
}
}

或者

            var param = "哈哈";
ThreadPool.QueueUserWorkItem(CallbackDemoViod, param);//这种写法方法体参数必须为object private static void CallbackDemoViod(object obj)
{
//以下不catch异常就会导致闪退
try
{
Console.WriteLine(obj.ToString());
}
catch (Exception ex)
{ Console.WriteLine(ex);
} }

或者

            var param = "哈哈";
WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
}; ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
((AutoResetEvent)o).Set();
}, waitHandles[]);
ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
((AutoResetEvent)o).Set();
}, waitHandles[]);
ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
((AutoResetEvent)o).Set();
}, waitHandles[]);
WaitHandle.WaitAll(waitHandles); static private void DTTEST(string a)
{
try
{
Console.WriteLine(a);
}
catch (Exception ex)
{ Console.WriteLine(ex);
}
}

4、通过任务开启线程

4.1通过Task

             Task wt1 = Task.Run(() =>
{
DTTEST();
});
Task wt2 = Task.Run(() =>
{
DTTEST();
});
Task wt3 = Task.Run(() =>
{
DTTEST();
});
var wtasks = new Task[] { wt1, wt2, wt3 };
Task.WaitAll(wtasks); static private void DTTEST()
{ Console.WriteLine($"测试并行调用{DateTime.Now}");
}

4.2 Task.Factory.StartNew

            int val = ;

            Task.Factory.StartNew(() =>
{
MessageBox.Show("测试StartNew:无参数");
}); Task.Factory.StartNew(a =>
{
MessageBox.Show("测试StartNew:参数值" + (int)a);
}, val);

5、Invoke实现

                  Parallel.Invoke(
() =>
{
DTTEST();
},
() =>
{
DTTEST();
},
() =>
{
DTTEST();
},
() =>
{
DTTEST();
},
() =>
{
DTTEST();
}
);

参考

C# 并行线程调用的更多相关文章

  1. SpringBoot开发案例之多任务并行+线程池处理

    前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...

  2. CUDA编程模型——组织并行线程2 (1D grid 1D block)

    在”组织并行编程1“中,通过组织并行线程为”2D grid 2D block“对矩阵求和,在本文中通过组织为 1D grid 1D block进行矩阵求和.一维网格和一维线程块的结构如下图: 其中,n ...

  3. 并发,并行,线程,进程,GIL锁

    1.并发和并行 并发: 同时做某些事,但是强调同一时段做多件事 如:同一路口,发生了车辆要同时通过路面的时间. 并行: 互不干扰的在同一时刻做多件事 如:同一时刻,同时有多辆车在多条车道上跑,即同时发 ...

  4. 【CUDA 基础】2.3 组织并行线程

    title: [CUDA 基础]2.3 组织并行线程 categories: CUDA Freshman tags: Thread Block Grid toc: true date: 2018-03 ...

  5. C#线程 并行线程

    第五部分 并行线程   在本节中,我们将介绍Framework 4.0新增的利用多核处理器的多线程API: 并行LINQ或PLINQ Parallel 类 任务并行性构造 并发集合 自旋锁和自旋等待 ...

  6. C# 跨线程调用控件

    在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁 ...

  7. 跨线程调用控件之MethodInvoker

    原文:http://www.cnblogs.com/cm8448940/archive/2008/07/10/1240045.html 使用到两个控件,一个按钮button1,一个标签label1. ...

  8. C# 跨线程调用问题

    纠结了好久,终于知道了winform和WPF的UI的跨线程调用的解决方法: winform下如果为了省事,可以直接禁用跨线程检查: Control.CheckForIllegalCrossThread ...

  9. c#中跨线程调用windows窗体控件

    c#中跨线程调用windows窗体控件解决. 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来 ...

随机推荐

  1. Scrapy采集某小说网站的全部小说

    链接: https://pan.baidu.com/s/1hrgYDzhgQIDrf4KmZxhW1w 密码: h1m6 源码以及运行图

  2. python的init函数里参数的作用

    问题发现 一直有一个疑问,有时我们在继承时,在__init__函数会出现可变参数*arg或关键字参数**kw这样的参数,这些参数有什么用?如果有用,这些参数时如何传递?传递些什么? 注:如果你不知道什 ...

  3. 利用Python进行多项式拟合

    多项式拟合的简单代码: import matplotlib.pyplot as plt import numpy as np x=[,,,,,,,] y=[,,,,,,,] a=np.polyfit( ...

  4. 、第1节 kafka消息队列:8、9、kafka的配置文件server.properties的说明

    10.kafka的配置文件说明 Server.properties配置文件说明 #broker的全局唯一编号,不能重复 broker.id=0 #用来监听链接的端口,producer或consumer ...

  5. java学习-初级入门-面向对象②-面向对象概述-面向对象程序设计

    我们在  面向对象①中学习了,结构化程序设计. 今天我们一起学习面向对象程序设计. 学习面向对象程序设计就要了解,在面向对象中重要的知识点. 继承  .  多态   . 抽象  . 接口 我们会在接下 ...

  6. 如何配置nginx

    Nginx安装手册 1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. n  gcc 安装nginx需要先将官网下载的源码进行编译,编译 ...

  7. 中间件kingshard入门(一):基本安装

    这里将进行简单的部署和配置,在配置之前,需要先了解一定的拓扑情况 类目           属性                备注 kingshard  10.11.10.214  无 master ...

  8. UOJ192 最强跳蚤

    题目链接 problem 给出一个n个点带边权的树,问有多少对\((u,v)\)满足\(u\)到\(v\)路径上边权的乘积为完全平方数. \(n\le 10^5,w\le 10^8\) solutio ...

  9. centos 安装 memcached

    centos 安装 memcached 1. 安装依赖: libeventyum install libevent-devel 2. 获取最新版本wget http://memcached.org/l ...

  10. Lesson 7 Bats

    In what way does echo-location in bats play a utilitarian role? Not all sounds made by animals serve ...