c#

位置:IT落伍者 >> c# >> 浏览文章

C#线程从陌生到熟悉:突飞猛进


发布日期:2018年04月28日
 
C#线程从陌生到熟悉:突飞猛进
谈到线程(Thread)大家应该不会陌生和他相近的还有一个进程的概念(Process)那首先我们先来熟悉他们的概念以及他们之间的关系

什么是进程?

当一个程序开始运行时它就是一个进程进程包括运行中的程序和程序所使用到的内存和系统资源

而一个进程又是由多个线程所组成的

什么是线程?

线程是程序中的一个执行流每个线程都有自己的专有寄存器(栈指针程序计数器等)但代码区是共享的即不同的线程可以执行同样的函数

他们的关系?

线程跟进程既有联系又有区别进程是代码在数据集的一次执行是系统资源分配的基本单位任何一个线程必然在一个进程中运行;而一个进程至少拥有一个线程否则无法执行事实上每个进程都有一个主线程该线程所拥有的其他线程都是由主线程创建的如果我们s结束一个进程的主线程就会结束该进程的所有其他线程也就结束整个进程!

我们可以这么理解真正去运行代码是线程!而进程只是为运行代码配置所运行的系统资源几个线程共同运行完成某项功能组织了一次代码执行过程!这样就有了进程!

C#里面是Thread类来表示线程的!那我们先来看看Thread类的定义

[ComVisibleAttribute(true)]

[ClassInterfaceAttribute(ClassInterfaceTypeNone)]

public sealed class Thread : CriticalFinalizerObject

_Thread

{

}

[ComVisibleAttribute(true)]这个表示控制程序集中个别托管类型成员或所有类型对 COM 的可访问性

[ClassInterfaceAttribute(ClassInterfaceTypeNone)]为公开给 COM 的类指定要生成的类接口的类型(如果有接口生成)

在从 CriticalFinalizerObject 类派生的类中公共语言运行库 (CLR) 保证所有关键终止代码都有机会执行即使是在 CLR 强行卸载应用程序域或中止线程的情况中(只要终结器遵守 CER 的规则);

_Thread此接口用于从非托管代码访问托管类不应从托管代码调用

这里注意的Thread类是声明sealed他是无法被继承的!这和Java的区别挺大的!

他有个构造函数我们主要看下其中两个就行了!

[SecuritySafeCritical]

public Thread(ParameterizedThreadStart start);

[SecuritySafeCritical]

public Thread(ThreadStart start);

ParameterizedThreadStart 和ThreadStart都为一个委托其中第一个委托表示带参数的委托类型为obj后面一个为不带参数的委托他们都被标记了[ComVisible(false)]表示不能对COM+进行访问!

通过Thread的一些静态属性能够得到当前的上下文当前运行的进程等等!通过他的静态方法能获得他的运行应用域等等!

下面我们看个例子

class Program

{

static void Main(string[] args)

{

ThreadStart tspx = new ThreadStart(PrintX);

ThreadStart tspy = new ThreadStart(PrintY);

ParameterizedThreadStart ptsp = new ParameterizedThreadStart(PrintParam);

Thread t = new Thread(tspx);

Thread t = new Thread(tspy);

Thread t = new Thread(ptsp);

tStart();

tStart();

tStart();

ThreadSleep();

}

public static void PrintX()

{

int i = ;

while (i++<)

{

ConsoleWrite(X);

}

}

public static void PrintY()

{

int i = ;

while (i++ < )

{

ConsoleWrite(Y);

}

}

public static void PrintParam(object s)

{

int i = ;

while (i++ < )

{

ConsoleWrite(sToString());

}

}

}

例子是比较简单运行之后的结果往往比较随机的!只需要把运行的次数调高点就可!注意ParameterizedThreadStart这个参数是Object类型的!从这个例子可看出这些线程是杂乱的运行的!只要将主线程结束整个应用程序就会结束而结束其他线程则不会!

请看下面的例子

using System;

using SystemCollectionsGeneric;

using SystemLinq;

using SystemText;

using SystemThreading;

namespace ConsoleApplication

{

class Program

{

static void Main(string[] args)

{

Thread t = new Thread(PrintX);

tStart();

ThreadCurrentThreadName = Main;

ConsoleWriteLine(主线程的应用域{}ID为{} ThreadGetDomain()ToString() ThreadGetDomainID());

ConsoleWriteLine(主线程的名字为{}HashCode为{} ThreadCurrentThreadName ThreadCurrentThreadGetHashCode());

}

static void PrintX ()

{

ThreadCurrentThreadName = t;

ConsoleWriteLine(t线程的应用域{}ID为{} ThreadGetDomain()ToString() ThreadGetDomainID());

ConsoleWriteLine(t线程的名字为{}HashCode为{} ThreadCurrentThreadName ThreadCurrentThreadGetHashCode());

}

}

}

这个例子运行如下图所示

这里通Thread的一些静态属性可以获得我们一些想要的东西!这一点在平时用的也比较多!

好了今天就写了这么多了!

               

上一篇:编程者必须学习的10项.NET技术

下一篇:趣味编程:自创C#扫雷代码