.Net进阶系列(12)-异步多线程(Thread和ThreadPool)(被替换)
一. Thread多线程
1. 两种使用方式
通过F12查看Thread后,发现有两类构造函数,ParameterizedThreadStart和ThreadStart,其中
ThreadStart:无参无返回值的委托
ParameterizedThreadStart:无返回值,但是有一个object类型参数的委托
下面Thread的使用都是围绕上面这两个构造函数来进行的。
方式一:(当委托是无参数,但赋值的方法又是有参数的,可以使用这种方式转换)
当只有一行的时候,可以省略{},实际上和下面一个道理
{
ThreadStart tStart = () => TestThread("参数1", "参数2");
//ThreadStart tStart2 = () =>
//{
// TestThread("参数1", "参数2");
//};
Thread thread = new Thread(tStart);
thread.Start();
}
方式二:(当委托是有一个object参数的时候, 如果赋值的方法不是只有一个参数,将不适用与该委托)不推荐这种方式,存在拆箱和装箱问题,效率低
{
ParameterizedThreadStart pStart = t => TestThread2(t.ToString());
//ParameterizedThreadStart pStart2 = (t) => TestThread2(t.ToString());
//ParameterizedThreadStart pStart3 = (t) =>
//{
// TestThread2(t.ToString());
//};
Thread thread = new Thread(pStart);
thread.Start("参数1");
}
2. 利用Join方法进行线程等待
{
List<Thread> list = new List<Thread>();
for (int i = ; i < ; i++)
{
string name1 = string.Format("ypf1-{0}", i);
string name2 = string.Format("ypf2-{0}", i);
ThreadStart tStart = () => TestThread(name1, name2);
Thread thread = new Thread(tStart);
list.Add(thread);
thread.Start();
}
//线程等待
foreach (var item in list)
{
item.Join();
}
}
3. 补充:可以利用IsBackground设置是否为后台线程
二. ThreadPool多线程
1. 使用方式
ThreadPool开启线程唯一的方式就是 ThreadPool.QueueUserWorkItem() ,QueueUserWorkItem的参数为WaitCallback,WaitCallback为有一个object类型参数的无返回值的委托,那么该委托将怎么应对,无参数函数、一个参数的函数、多个参数的函数。
//1. 没有参数
{
WaitCallback wcl = t => TestThread3();
ThreadPool.QueueUserWorkItem(wcl);
}
//2. 一个参数
{
WaitCallback wcl = t => TestThread2(t.ToString());
ThreadPool.QueueUserWorkItem(wcl, "测试参数1");
}
//3. 两个参数
{
//因为WaitCallback委托没法结束有两个参数的方法,这里我们采用将方法封装到类中的方式解决
MyTest<string, string> model = new MyTest<string, string>("测试参数1", "测试参数2");
WaitCallback wcl = (t) =>
{
model.TestThread();
};
ThreadPool.QueueUserWorkItem(wcl);
}
public class MyTest<T,M>
{
public T msg1 { get; set; }
public M msg2 { get; set; }
public MyTest(T t1,M m1)
{
this.msg1 = t1;
this.msg2 = m1;
}
public void TestThread()
{
Console.WriteLine("线程开始:测试参数为:{0}和{1},当前线程的id为:{2}", msg1, msg2, System.Threading.Thread.CurrentThread.ManagedThreadId);
long sum = ;
for (int i = ; i < ; i++)
{
sum += i;
}
Console.WriteLine("线程结束:测试参数为:{0}和{1},当前线程的id为:{2}", msg1, msg2, System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}
2. 多线程等待
List<ManualResetEvent> list = new List<ManualResetEvent>();
for (int i = ; i < ; i++)
{
ManualResetEvent mr = new ManualResetEvent(false);
WaitCallback wcl = t =>
{
TestThread2(t.ToString());
mr.Set(); //将该线程设置为终止状态
};
list.Add(mr);
ThreadPool.QueueUserWorkItem(wcl, "测试参数1");
}
foreach (var item in list)
{
item.WaitOne();
}
3. 线程池的基本设置
{
//1.设置最大和最小线程数
ThreadPool.SetMaxThreads(, );
ThreadPool.SetMinThreads(, );
//2.工作线程和IO线程最大值和最小值的获取(注释掉上面的设置,然后看下面的获取结果)
int workerThreads;
int ioThreads;
{
ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);
Console.WriteLine(String.Format("Max worker threads: {0}; Max I/O threads: {1}", workerThreads, ioThreads));
}
{
ThreadPool.GetMinThreads(out workerThreads, out ioThreads);
Console.WriteLine(String.Format("Min worker threads: {0}; Min I/O threads: {1}", workerThreads, ioThreads));
}
{
ThreadPool.GetAvailableThreads(out workerThreads, out ioThreads);
Console.WriteLine(String.Format("Available worker threads: {0}; Available I/O threads: {1}", workerThreads, ioThreads));
}
}
.Net进阶系列(12)-异步多线程(Thread和ThreadPool)(被替换)的更多相关文章
- .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)
一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...
- .Net进阶系列(10)-异步多线程综述(被替换)
一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...
- .Net进阶系列(15)-异步多线程(线程的特殊处理和深究委托赋值)(被替换)
1. 线程的异常处理 我们经常会遇到一个场景,开启了多个线程,其中一个线程报错,导致整个程序崩溃.这并不是我们想要的,我需要的结果是,其中一个线程报错,默默的记录下,其它线程正常进行,保证程序整体可以 ...
- .Net进阶系列(14)-异步多线程(async和await)(被替换)
1. 方法名前只有async,但是方法中Task实例前没有await关键字,该方法和普通方法没有什么区别,但是会报一个警告. #region 情况一 /// <summary> /// ...
- .Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)
一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...
- .NET进阶篇06-async异步、thread多线程1
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 异步多线程挺大一块内容,既想拆开慢慢学,又想一股脑全倒出.纠结再三,还是拆开吃透,也不至于篇幅过长,劝退许多人 本篇先做一个概述,列明一些基本概 ...
- 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...
- 异步多线程 Thread ThreadPool Task
一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...
- 多线程-Thread和ThreadPool
多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...
随机推荐
- IE下JS保存图片
function ieSave() { var img = document.images[0]; ...
- Docker(十三)-Docker save and load镜像保存
持久化docker的镜像或容器的方法 Docker的镜像和容器可以有两种方式来导出 docker save #ID or #Name docker export #ID or #Name docker ...
- Oracle 数据库 Only 导出空表的方法
1. 之前因为oracle11.2.0.1 的bug(deferred_segment_creation) 引起无法将空表导出. 有时给同事解释上半个小时他们也不知道 如何处理 或者是 他们不会用ex ...
- __slots__用法以及优化
其实也是无意之中又看到这个东西,这次索性再记一下,免得下次忘记又再看一遍,往复循环浪费了太多时间. __slots__其实我做项目这么久还没有主动使用过.下面reference有提到这么一句话 War ...
- C#實現XML的增刪查改
命名空間:using System.Xml; 1.查找某個節點是否存在: private XmlDocument xmldoc; private string mod="1"; p ...
- Centos7 ping 未知的名称或服务 DNS 配置问题
通常解析不了域名一般都是DNS域名配置有问题 对接口添加dns信息:编辑/etc/sysconfig/network-scripts/ifcfg-ethxxxxxxx,x可能是其他数字,但一般是ifc ...
- linux 运维常用的一些命令收集
1.删除0字节文件find -type f -size 0 -exec rm -rf {} ; 2.查看进程按内存从大到小排列ps -e -o “%C : %p : %z : %a”|sort ...
- spring cloud 入门系列一:初识spring cloud
最近看到微服务很火,也是未来的趋势, 所以就去学习下,在dubbo和spring cloud之间我选择了从spring cloud,主要有如下几种原因: dubbo主要专注于微服务中的一个环节--服务 ...
- 自学工业控制网络之路1.4-典型的现场总线介绍CAN
返回 自学工业控制网络之路 自学工业控制网络之路1.4-典型的现场总线介绍CAN 1991年3月,发布了CAN技术贵干v2.0,包含了A.B两部分.CAN2.0A给出报文标准格式,CAN2.0B给出了 ...
- HTML for android 移动小球
<html> <head> <title>球</title> <style type="text/css"> .test ...