一. 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)(被替换)的更多相关文章

  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进阶系列(13)-异步多线程(Task和Parallel)(被替换)

    一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...

  6. .NET进阶篇06-async异步、thread多线程1

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 异步多线程挺大一块内容,既想拆开慢慢学,又想一股脑全倒出.纠结再三,还是拆开吃透,也不至于篇幅过长,劝退许多人 本篇先做一个概述,列明一些基本概 ...

  7. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  8. 异步多线程 Thread ThreadPool Task

    一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...

  9. 多线程-Thread和ThreadPool

    多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...

随机推荐

  1. FICO基础知识(四)

    What is the organizational structure for CO? Operating Concern 经营组织 Controlling Area 成本控制范围 Profit c ...

  2. 照片 GPS 信息查询

    照片 GPS 信息查询 经纬度查询 https://jingweidu.51240.com/ // 30.27832833333333, 120.01914111111111 30 + 16/60 + ...

  3. Test Scenarios for image upload functionality (also applicable for other file upload functionality)

    1 check for uploaded image path2 check image upload and change functionality3 check image upload fun ...

  4. xhtml的3種文檔聲明類型

    xhtml有三種文檔聲明類型: strict:使用嚴格的標記,避免語法上的混亂: trasitional:為不支持的css的瀏覽器編寫xhtml時: frameset:利用框架將窗口分割為兩個部分或多 ...

  5. LOJ6045 雅礼集训 2017 Day8 价(最小割)

    由Hall定理,任意k种减肥药对应的药材数量>=k.考虑如何限制其恰好为k,可以将其看作是使对应的药材数量尽量少. 考虑最小割.建一个二分图,左边的点表示减肥药,右边的点表示药材.减肥药和其使用 ...

  6. Redis报错总结

    MISCONF Redis is configured to save RDB snapshots MISCONF Redis is configured to save RDB snapshots, ...

  7. pip download 只下载不安装命令的使用方法

    比如下载 django 1.8.11版本和simplejson 3.14.0版本的包 那么就将所需的包写入  requirement.txt 那么我的requirement.txt内容就是: djan ...

  8. Codeforces Round #418 (Div. 2) B. An express train to reveries

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  9. 【BZOJ3817/UOJ42】Sum(类欧)

    [BZOJ3817/UOJ42]Sum(类欧) 题面 BZOJ UOJ 题解 令\(x=\sqrt r\),那么要求的式子是\[\sum_{d=1}^n(-1)^{[dx]}\] 不难发现,对于每个\ ...

  10. module 'scipy.misc' has no attribute 'toimage',python

    anaconda环境下: 错误:python 命令行运行出错:module 'scipy.misc' has no attribute 'toimage' 解决:打开Anaconda prompt,输 ...