.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.良好的交互,特别对 ...
随机推荐
- [转帖]老狼:你知道哪些关于 Windows 10 的骚操作?
作者:老狼链接:https://www.zhihu.com/question/265781599/answer/579939418来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Jfrog 与 jenkins Sonarqube的 测试样例 (From jfrog 培训)
1. 获取jfrog 仓库地址 sonar的地址 jenkins的地址. 本次例子的地址为: jenkins地址:http://10.24.101.99:8080/ artifactory地址: ht ...
- ionic3.x开发小坑记录(一)
自定义font的时候,在assets中创建的文件夹名字别用fonts,会与ionic默认样式冲突,在浏览器中调试是正常的,到手机上就出问题了. 在html中写img的src直接如图 assets前面 ...
- python主成分分析
#-*- coding: utf-8 -*- #主成分分析 降维 import pandas as pd #参数初始化 inputfile = '../data/principal_component ...
- SVN上线步骤笔记
项目代码位置: /data/svn/play_out 项目代码目录名称: test SVN创建位置:/data/svn/repos_Websvn线上地址:svn://192.168.1.1/repos ...
- Python——多进程
进程的实例 # -*- coding:UTF-8 -*- import os import time from multiprocessing import Process #进程 def func( ...
- Struts2 Intercepter 笔记
以前一直对Struts2的自定义拦截器(intercepter)不是很清楚,今天仔细研究了下,终于搞懂了,现在记录对拦截器的总结如下: 1:自定义拦截器的作用一般就是用来实现系统权限控制比较多: 2: ...
- XQN number format
Q Numbers FormatAn XQN format number is an 1+X+N bit twos complement binary number; a sign bitfollow ...
- codeforces518B
Tanya and Postcard CodeForces - 518B 有个小女孩决定给他的爸爸寄明信片.她已经想好了一句话(即长度为n的字符串s),包括大写和小写英文字母.但是他不会写字,所以她决 ...
- ueditor 使用
之前在微信上用到富文本编辑器,选用了ueditor 之后又在项目中使用到了,因此打算写下来记录一下. 1 首先去下载ueditor 2 我的是 MVC项目,贴一下:粘贴到Content下 3 然后 ...