一.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学习的更多相关文章

  1. InnoDB master thread学习

    很久很久没有写博客了,工作比较忙,也没什么时间学习了,恰逢国庆放假,安心的学习一下,其实只是把之前学习过的知识再温习了一下而已.InnoDB 有众多的线程,其中非常核心的就是master thread ...

  2. thread学习笔记--BackgroundWorker 类

    背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...

  3. Thread学习

    1.定义 2.作用 3.和进程的比较 4.多线程(multithreading)的优点和缺陷 5.调度(scheduling) 6.线程相关概念 定义 线程就是最小的可编程指令序列,是进程的子集.一个 ...

  4. c++11: <thread>学习

    <thread>头文件中包含thread类与this_thread命名空间,下面逐一介绍. thread类 1. 构造函数 (1)默认构造函数 thread() noexcept; 默认构 ...

  5. Boost Thread学习笔记五

    多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...

  6. Boost Thread学习笔记四

    barrierbarrier类的接口定义如下:  1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 pub ...

  7. Boost Thread学习笔记三

    下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...

  8. Boost Thread学习笔记二

    除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...

  9. Boost Thread学习笔记

    thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...

  10. thread 学习

    #include <thread> #include <cstdio> #include <utility> #include <iostream> v ...

随机推荐

  1. jenkins获取测试报告展示的方法

    1.写好了可以生成报告的python文件 2.在jenkins里下载 HTML Publisher plugin  插件 系统管理--管理插件--选择[可选插件]tab---搜索HTML Publis ...

  2. 【转】Jmeter项目测试

    Jmeter的录制回放功能是现将你对要测试的项目进行访问的历史记录进行录制,然后虚拟出多个用户对历史记录进行回放,从而达到压力测试的目的. 录制是通过代理服务器进行录制. 一.下载地址 http:// ...

  3. python 类实例化,修改属性值

    class User(object): def __init__(self, first_name, last_name, login_attempts): self.first_name = fir ...

  4. Netty Client 重连实现

    当我们用Netty实现一个TCP client时,我们当然希望当连接断掉的时候Netty能够自动重连.Netty Client有两种情况下需要重连: Netty Client启动的时候需要重连 在程序 ...

  5. 乘积最大(线性dp)

    乘积最大 时间限制: 1 Sec  内存限制: 128 MB提交: 4  解决: 4[提交][状态][讨论版][命题人:quanxing] 题目描述 今年是国际数学联盟确定的“2000——世界数学年” ...

  6. 关系数据库元组关系演算语言ALPHA

    关系演算 :以数理逻辑中的谓词演算为基础 按谓词变元不同分类 1.元组关系演算:以元组变量作为谓词变元的基本对象元组关系演算语言ALPHA2.域关系演算:以域变量作为谓词变元的基本对象域关系演算语言Q ...

  7. HTTP 与TCP/IP 、Socket区别(一)

    网络由下往上分为: 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- TCP协议 会话层-- 表示层和应用层-- HTTP协议 1.TCP/IP连接 手机能够使用联网功能是因为手机底层实现 ...

  8. MVC 公共类App_Code不识别

    .Net MVC需要写公共类的时候 右击添加 App_Code 文件夹,新建类—>右击类—>属性,生成操作 —>选择 —>编译 .net MVC项目本身是个应用程序,所以其实不 ...

  9. Java 对象和实例的区别

    本来我以为是一样的,其实是不一样的 参看:http://www.blogjava.net/dreamstone/archive/2011/06/03/101733.html

  10. 不使用sudo命令执行docker

    不使用sudo命令执行docker  2015-09-11 11:03:05  王春生  8049 最后编辑:王春生 于 2015-09-11 12:18:30 简介:本篇文章介绍如何不使用sudo命 ...