zoukankan      html  css  js  c++  java
  • 线程

    AppDomain,进程和线程的关系

    还是用图来说明比较容易理解。

    image

    image

    可以总结为以下几句话。

    1,进程可以理解为程序(.exe)的实例。线程可以理解为一个虚拟的CPU。

    2,一个进程可包含多个线程和多个Appdomain。

    3,一个线程可以穿梭在多个Appdomain中,但在同一时刻,线程只会处在其中一个Appdomain中。

    前台线程和后台线程

    1,前台线程和后台线程的区别在于,应用程序必须运行完所有的前台线程才可以退出,而对于后台线程,可以不考虑其是否运行完而直接退出,所有的后台线程在应用程序退出时就自动结束了。

    2,默认情况下,主线程和使用Thread创建的线程都是前台线程,除非手动设置IsBackground= true。

    多线程和异步的区别

    学习异步编程的时候,我总是分不清多线程和异步之间的区别。可以简单理解为:

    相同:避免阻塞前台线程,提高程序的可响应性。

    区别:

    1,多线程只是实现异步的多种方式中的一种,比如为了实现异步,.net为我们提供了三种不同的异步实现方式,APM,EAP和TAP。

    2,应用场景不同。多线程一般应用在计算密集型工作,而异步更适合在IO密集型工作。

    .net中实现异步的几种方式

    1,异步编程模型(APM)【不推荐】

    2,基于事件的异步(EAP)【不推荐】

    3,基于任务的异步(TAP)【推荐】

    先了解下.net为我们提供了这几种方式实现异步,后面会分别总结。

    线程的启动,挂起和结束

    1,启动线程,Thread.Start方法。

    2,挂起线程,也叫阻塞线程,Thread.Sleep方法。

    3,结束线程,Thread.Abort方法。

    Demo

    上代码。

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading;
      6 using System.Threading.Tasks;
      7 
      8 namespace AsyncCoding
      9 {
     10     class Program
     11     {
     12         static void Main(string[] args)
     13         {
     14             var thread1 = new Thread(Go1);
     15             thread1.IsBackground = true;//默认为前台线程
     16             thread1.Start();//启动线程
     17 
     18             Console.WriteLine("我是主线程,Thread Id:{0}", Thread.CurrentThread.ManagedThreadId);
     19 
     20             Thread.Sleep(500);//挂起线程,模拟等待异步线程做事情
     21             thread1.Abort();//结束异步线程
     22 
     23             Console.ReadKey();
     24         }
     25 
     26         public static void Go1()
     27         {
     28             Console.WriteLine("我是异步线程,Thread Id:{0}", Thread.CurrentThread.ManagedThreadId);
     29 
     30             try
     31             {
     32                 for (int i = 0; i < 10; i++)
     33                 {
     34                     Thread.Sleep(100);//模拟每次执行需要100ms
     35                     Console.WriteLine("异步线程运行:{0}", i);
     36                 }
     37             }
     38             catch (ThreadAbortException ex)
     39             {
     40                 Console.WriteLine("异步线程被强制结束!");
     41             }
     42         }
     43     }
     44 }
    View Code

    代码运行顺序。

    image

    运行结果。

    image

  • 相关阅读:
    harass
    matlab的legend()用法
    migrate
    大千敦煌面壁
    三维插值(MATLAB)——TriScatteredInterp/scatteredInterpolant函数
    有哪些不出名的诗人写的千古名句?
    听吴翰清讲课笔记
    移动着,心就变了
    人活着为了什么?
    人生就是一场修炼
  • 原文地址:https://www.cnblogs.com/mcgrady/p/5652901.html
Copyright © 2011-2022 走看看