C#Thread学习
一.Thread的使用方式
1.不带参数
(1)使用lambda
public static void fun1()
{
Console.WriteLine($"Main ThreadId:{Thread.CurrentThread.ManagedThreadId}");
new Thread(new ThreadStart(() =>
{
Console.WriteLine($"Thread ThreadId:{Thread.CurrentThread.ManagedThreadId}");
})).Start();
}
(2)使用方法
public static void ConsoleString()
{
Console.WriteLine($"Thread ThreadId:{Thread.CurrentThread.ManagedThreadId}");
} public static void fun2()
{
Console.WriteLine($"Main ThreadId:{Thread.CurrentThread.ManagedThreadId}");
new Thread(new ThreadStart(ConsoleString)).Start();
}
2.带参数(只允许带一个object类型参数)
public static void fun3()
{
Console.WriteLine($"Main ThreadId:{Thread.CurrentThread.ManagedThreadId}");
new Thread(new ParameterizedThreadStart(t =>
{
Console.WriteLine($"{t} Thread ThreadId:{Thread.CurrentThread.ManagedThreadId}");
})).Start("haha");
}
3.等待线程执行
public static void fun4()
{
Console.WriteLine($"Main start ThreadId:{Thread.CurrentThread.ManagedThreadId}");
Thread t = new Thread(new ThreadStart(() =>
{
Thread.Sleep(1000);
Console.WriteLine($"Thread ThreadId:{Thread.CurrentThread.ManagedThreadId}");
}));
t.Start();
t.Join();
Console.WriteLine($"Main end ThreadId:{Thread.CurrentThread.ManagedThreadId}");
}
执行结果:
4.结束线程
Abort();
二.IsBackground讲解
thread.IsBackground=true:该线程为后台线程
thread.IsBackground=true:该线程为前台线程,Thread默认为前台线程
1.前台线程和后台线程的区别
Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
原理:只要所有前台线程都终止后,CLR就会对每一个活在的后台线程调用Abort()来彻底终止应用程序
2.使用建议
对于一些在后台运行的线程,当程序结束时这些线程没有必要继续运行了,那么这些线程就应该设置为后台线程。比如一个程序启动了一个进行大量运算的线程,可是只要程序一旦结束,那个线程就失去了继续存在的意义,那么那个线程就该是作为后台线程的。而对于一些服务于用户界面的线程往往是要设置为前台线程的,因为即使程序的主线程结束了,其他的用户界面的线程很可能要继续存在来显示相关的信息,所以不能立即终止它们。这里我只是给出了一些原则,具体到实际的运用往往需要编程者的进一步仔细斟酌。
一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。
3.示例
public static void fun5()
{
Thread t1 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i < 50; i++)
{
Thread.Sleep(100);
Console.WriteLine($"Thread1 {i} ThreadId:{Thread.CurrentThread.ManagedThreadId}");
}
}));
t1.Start(); Thread t2 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
Console.WriteLine($"Thread2 {i} ThreadId:{Thread.CurrentThread.ManagedThreadId}");
}
}));
t2.IsBackground = true;
t2.Start();
}
运行结果:
当t1执行完后,t2也不在执行,说明t1执行完成后,进程结束。
4.结束进程方式关联
private void fun()
{
Thread t1 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i < 50; i++)
{
Thread.Sleep(1000);
Debug.WriteLine($"Thread1 {i} ThreadId:{Thread.CurrentThread.ManagedThreadId}");
}
}));
t1.Start(); Thread t2 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(1000);
Debug.WriteLine($"Thread2 {i} ThreadId:{Thread.CurrentThread.ManagedThreadId}");
}
}));
t2.IsBackground = true;
t2.Start();
}
(1)winform中:Application.Exit():所有线程都结束后(前台线程都结束后,后台线程自动结束),然后进程结束
执行 Application.Exit()
结果:等待t1执行完后,t2也不在执行,然后结束进程。
(2)Environment.Exit(0):不等待线程结束,直接结束进程
执行 Environment.Exit(0)
结果:直接结束进程,不等待线程。
参考:
https://blog.csdn.net/Fenglele_Fans/article/details/78555895
https://www.cnblogs.com/Again/articles/7085596.html
C#Thread学习的更多相关文章
- InnoDB master thread学习
很久很久没有写博客了,工作比较忙,也没什么时间学习了,恰逢国庆放假,安心的学习一下,其实只是把之前学习过的知识再温习了一下而已.InnoDB 有众多的线程,其中非常核心的就是master thread ...
- thread学习笔记--BackgroundWorker 类
背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...
- Thread学习
1.定义 2.作用 3.和进程的比较 4.多线程(multithreading)的优点和缺陷 5.调度(scheduling) 6.线程相关概念 定义 线程就是最小的可编程指令序列,是进程的子集.一个 ...
- c++11: <thread>学习
<thread>头文件中包含thread类与this_thread命名空间,下面逐一介绍. thread类 1. 构造函数 (1)默认构造函数 thread() noexcept; 默认构 ...
- Boost Thread学习笔记五
多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...
- Boost Thread学习笔记四
barrierbarrier类的接口定义如下: 1 class barrier : private boost::noncopyable // Exposition only 2 { 3 pub ...
- Boost Thread学习笔记三
下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...
- Boost Thread学习笔记二
除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...
- Boost Thread学习笔记
thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...
- thread 学习
#include <thread> #include <cstdio> #include <utility> #include <iostream> v ...
随机推荐
- 字符串转换为字典的函数eval(字符串)
首先把多行的字符串,变成一个字符串,用'''和'''扩起来: 然后把这个字符串,赋值给b 这个时候,b根本调不出来,也用不起来: 用eval(b),来格式化字符串变成字典: 然后b就变成了一个字典:
- mysql 常见参数
my.cnf[client] 对mysql的所有客端都生效的[mysql] 只对mysql这个命令有效了[mysqd][mysqld_multi] 多实例启动[mysqld_safe][mysqldN ...
- git版本控制-详细操作
- git,软件帮助使用者进行版本的管理 阶段一git 命令: git init 初始化 git config --global user.email "you@example.com&qu ...
- git学习3 - 克隆远程库到本地 将本地库上传到git
如何克隆远程版本库到本地 git clone URL 如何用命令将本地项目上传到git 1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 (注意: cd C:/U ...
- Python Twisted系列教程9:第二个小插曲,Deferred
作者:dave@http://krondo.com/a-second-interlude-deferred/ 译者:杨晓伟(采用意译) 可以从这里从头来阅读这个系列 更多关于回调的知识 稍微停下来再思 ...
- windows网络服务之配置网络负载均衡(NLB)群集
O首页51CTO博客我的博客 搜索 每日博报 社区:学院论坛博客下载更多 登录注册 家园 学院 博客 论坛 下载 自测 门诊 周刊 读书 技术圈 曾垂鑫的技术专栏 http:// ...
- Struts2 result type(结果类型)
转自:http://www.cnblogs.com/liaojie970/p/7151103.html 在struts2框架中,当action处理完之后,就应该向用户返回结果信息,该任务被分为两部分: ...
- Python基础学习三 字符串
字符串方法 slit = ['a', 'b', 'c', 'd', 'f', 'g'] s2='hhhhhhhhhh' tu = (1,2,3,4,5) d={'name':'nnn','age':1 ...
- Python模块及其导入
一.模块 1.模块的定义: 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少, 很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件 ...
- Tornado 接口的实现