C#线程篇---解答线程之惑(2)

我们都知道,在这个行业,追求的就是用最少的时间学最多的知识,这是我写这个系列最想达到的目标,在最快的时间内,帮助更多的人学习更多的线程知识。

前一篇,讲述了线程基础,给大家铺垫了一个基础,这一篇着重介绍线程的作用及其工作方式,顺便小试牛刀一把。

现在我想提出,最直接的问题是:

为什么要使用线程?

  为什么要使用线程?答案只有三点(欢迎补充^_^):

  1. 使用线程可以将代码同其他代码隔离。这将提高应用程序的可靠性,这不仅仅是应用程序所需要的,更是Windows引入线程的真正原因。
  2. 使用线程可以简化编程。这个答案有利有弊,需要从两方面考虑:第一点:使用线程的同时也就意味着会付出一些资源作为代价,对于现在的计算机,付出资源是值得的,因为它的资源根本没有发掘出来。第二点:引用线程的时候是在需要相互协作的代码时,不能随便的引用线程,盲目的使用线程,只会增加代码复杂度。
  3. 可以用线程来程序的实现并发执行,双管齐下,效率,你懂的(∩_∩)。

说了这么些,总得试试手啊,使用线程?so easy:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程:启动专用线程...");
            Thread dedicatedThread = new Thread(StartCode);

            dedicatedThread.Start(5);
 
            Console.WriteLine("主线程:运行到此");
            Thread.Sleep(10000);//模拟主线程操作
            dedicatedThread.Join();
            Console.WriteLine("主线程:运行完毕");
        }


        private static void StartCode(Object obj)
        {
            Console.WriteLine("子线程:启动代码!{0}",obj);
            Thread.Sleep(1000);//模拟代码操作
 
        }
    }

下面是我两次运行的结果:

这是最基本的线程运用,好像不难哦?但是不提倡这么用。

中间有个Join方法,Join的作用是:造成调用线程阻塞当前执行的任何代码,直到dedicatedThread所代表的线程终止或销毁。

同一个程序出现两种输出结果,这是为什么?程序的每次输出不该是一样的吗?

两种输出的不一样是因为Windows对两个线程进行调度的方式不同,这无法控制。Windows抢占式多线程这一概念觉得了这因素。

这个知识点大家有必要了解,这个例子是个专用线程你可以这么用,但是建议应避免这么做,CLR的线程池可以更安全的完成这些事,如果你一定要创

建自己的线程,开始执行专用线程时,需考虑以下四点内容:

  1. 线程需要以非普通线程优先运行。线程池线程都是普通优先级运行,可以更改这个优先级,但不建议这么做。在不同的线程池操纵之间,优先级的更改是无法延续的(线程池这个概念下篇解析)。
  2. 需要线程表现为一个前台进程,防止应用程序在线程结束它的任务之前终止。(线程池的线程始终是后台线程,如果CLR要终止进程,它们就可能无法被迫完成任务)
  3. 一个计算限制的任务需要长时间的运行,就像例子中StartCode(),它执行的就是计算限制的任务。为长时间运行的任务创建一个专业线程,用于避免这个问题。
  4. 任务线程可能调用Abort()(属于Thread)来提前终止它。

线程可以分为前台线程和后台线程

  CLR将每个线程要么视为前台,要么视为后台线程。当一个进程中的所有前台线程停止运行时(也就是我们按右上角的X,关闭程序),CLR将强制终止仍在运行的后台线程直接终止,不会异常。

  基于这个原因,前台线程的使用应该用于执行确实想完成的任务,就用个我们正在用浏览器(下面称前台线程)做例子:

  你正在浏览本篇内容,就意味着这个前台线程,正要完成你所需求的任务指令,解析HTML代码,便于你的阅读,这是首要任务。而加载书签,读取收藏网址的信息等,关键的后台功能,能在应用程序重启的时候继续执行,如果关闭前台线程,它们没必要保持活动的状态。

下面来看个前台线程和后台线程的程序实现:

class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(StartCode);
           // t.IsBackground = true;
            t.Start();


            Console.WriteLine("主线程运行完毕!");
        }

        private static void StartCode()
        {
            Console.WriteLine("开始执行子线程...");
            Thread.Sleep(10000);//模拟代码操作
            Console.WriteLine("子线程执行完毕!");
 
        }
    }

这段可运行代码就是默认模式,执行的前台代码。它的输出也是你能预测的:

在“开始执行子线程...”的时候,需要等待10秒。

去掉第6行的注释,再看看运行结果:

它不会等待,并看不到“子线程执行完毕”这句话。

前台的好处是,你可以保证你的后台线程能执行完毕,后台线程的好处是,你不用管它的执行。

在一个线程的生存期中,任何时候都可以进行前后台互换。

CLR要提供前台线程和后台线程的概念来更好的支持应用程序域(俗称AppDoMain),每个AppDoMain都可以运行一个单独的应用程序,每个应用程序都有它的前台线程,一个应用程序退出,前台线程终止,对应的后台线程也要终止,但CLR线程仍然需要运行,使其他应用程序继续运行,所有应用程序退出后,整个进程就可以销毁了。CLR算是线程运行的一个空间。

  最后,说个大家十分熟悉的功能,用过Visual Studio 的开发人员,我保证你们都体验过这个功能。

  智能提示都知道,这个是典型的线程运用,很快捷很舒心是不是?

  当你写代码写到兴头时,发现编译器画出红线提示你,某处代码出错了。有没有发现这个?怎么实现的?

  在你停止输入的时候,编译器就会开始编译代码,检测代码中的出错部分,很人性化,这大大提高了C#开发人员的工作效率,而在这,线程功不可没,线程的力量可见一斑。

  线程基础还有一节重要的。下回讲~~~

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-08-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang学习--GroupCache的使用

groupcache 是 Brad Fitzpatrick 最新的作品,目标在于取代一部分memcached的功能。以官方的说明是:groupcache ...

61090
来自专栏贾老师の博客

Linux 系统监控

46420
来自专栏Linyb极客之路

面对海量请求,缓存设计还应该考虑哪些问题?

从第一个缓存框架 Memcached 诞生以来,缓存就广泛地存在于互联网应用中。如果你的应用流量很小,那么使用缓存可能并不需要做多余的考虑。但如果你的应用流量达...

10040
来自专栏Golang语言社区

从websocket看go的应用

Go是互联网时代的通用编程语言。这样它就和命令行时代的C语言、图示界面时代的C++、以及互联网早期的Java语言等有不同的侧重。它强调保持自身的精巧和独立,从而...

43280
来自专栏FreeBuf

Flash XSS检测脚本的简单实现

前言 这里主要是讲如何快速扫描到有问题的flash文件,用于批量,有时候很笨的方法也会有奇效,下面记录一下在实现过程中的一些思路和遇到的一些坑。 ? 第三方插件...

32550
来自专栏木头编程 - moTzxx

Redis 在PHP中的使用笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

14450
来自专栏大内老A

ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的。如果我们将最终处理HTTP请求的组件称为HttpHandler,...

13000
来自专栏Bug生活2048

小程序云开发使用体验

这里发现直接更新有点慢,直接下载最新版然后覆盖比较快,打开最新的开发者工具之后会发现多了个云开发:

72720
来自专栏技术小讲堂

探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终

Why 在应用程序,尤其是互联网应用程序中,性能一直是很多大型网站的困扰,由于Web2.0时代的到来,人们更多的把应用程序从C/S结构迁移到B/S结构,这样会带...

32170
来自专栏编程

花5分钟教会你用python搭建出一个动态网页,零基础也能学得会

本套录屏教程,是为初学者准备的,确保非计算机专业的也能跟着一步一步玩转python,既培养出兴趣,又玩出点东西。 上一讲介绍了我们如何用python发布一个静态...

24570

扫码关注云+社区

领取腾讯云代金券