c#线程编程的一些集合

来源:互联网 发布:开淘宝店一个月赚3万 编辑:程序博客网 时间:2024/05/07 05:44

线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。
每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。Win32 SDK内置函数支持多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。

在本质上和结构来说,.NET是一个多线程的环境。有两种主要的多线程方法是.NET所提倡的:使用ThreadStart来开始你自己的进程,直接的(使用ThreadPool.QueueUserWorkItem)或者间接的(比如Stream.BeginRead,或者调用BeginInvoke)使用ThreadPool类。一般来说,你可以"手动"为长时间运行的任务创建一个新的线程,另外对于短时间运行的任务尤其是经常需要开始的那些,进程池是一个非常好的选择。进程池可以同时运行多个任务,还可以使用框架类。对于资源紧缺需要进行同步的情况来说,它可以限制某一时刻只允许一个线程访问资源。这种情况可以视为给线程实现了锁机制。线程的基类是System.Threading。所有线程通过CLI来进行管理。

NET将关于多线程的功能定义在System.Threading名字空间中。因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;

·创建线程:

创建一个新的Thread对象的实例。Thread的构造函数接受一个参数:

Thread thread1 = new Thread(new ThreadStart( Count));
其中的 Count 是将要被新线程执行的函数。


·执行线程:

使用Threading命名空间里的start方法来运行线程:
DummyThread.Start ();
·组合线程:
经常会出现需要组合多个线程的情况,就是当某个线程需要其他线程的结束来完成自己的任务。假设DummyThread必须等待DummyPriorityThread来完成自己的任务,只需要这样做:
DummyPriorityThread.Join() ;

·暂停线程:

使得线程暂停给定的秒
DummyPriorityThread.Sleep(<Time in Second>);
DummyPriorityThread.Abort();
thread.Sleep(1000); 就是让线程休眠1秒钟。

·中止线程:

如果需要中止线程可以使用如下的代码:

.优先级

Thread类中hreadPRiority属性,它用来设置优先级,但不能保证操作系统会接受该优先级。一个线程的优先级可分为5种:Normal, AboveNormal, BelowNormal, Highest, Lowest。具体实现例子如下:
thread.Priority = ThreadPriority.Highest;


·同步

经常会遇到需要在线程间进行同步的情况,下面的代码给出了一些方法:
using System;
using System.Threading;
namespace SynchronizationThreadsExample
{
class SynchronizationThreadsExample
{
private int counter = 0;
static void Main( )
{
SynchronizationThreadsExample STE = new SynchronizationThreadsExample();
STE.ThreadFunction( );
}
public void ThreadFunction ( )
{
Thread DummyThread = new Thread( new ThreadStart(SomeFunction)) ;
DummyThread.IsBackground=true;
dummythread.name = "First Thread";
DummyThread.Start( );
Console.WriteLine("Started thread ", dummythread.name);
Thread DummyPriorityThread = new Thread( new ThreadStart(SomeFunction) );
DummyPriorityThread.IsBackground=true;
DummyPriorityThread.Name = "Second Thread";
DummyPriorityThread.Start( );
Console.WriteLine("Started thread ", DummyPriorityThread.Name);
DummyThread.Join( );
DummyPriorityThread.Join( );
}
public void SomeFunction( )
{
try
{
while (counter < 10)
{
int tempCounter = counter;
tempCounter ++;
Thread.Sleep(1);
counter = tempCounter;
Console.WriteLine( "Thread . SomeFunction: "+Thread.CurrentThread.Name+counter);
}
}
catch (ThreadInterruptedException Ex)
{
Console.WriteLine( "Exception in thread "+Thread.CurrentThread.Name);
}
finally
{
Console.WriteLine( "Thread Exiting. "+Thread.CurrentThread.Name);
}
}
}
}

·使用Interlock

C#提供了一个特殊的类叫做interlocked,就是提供了锁机制的实现,可以加入如下的代码实现锁机制:
Interlocked.SomeFunction (ref counter);
·使用锁
这是为了锁定代码关键区域以进行同步,锁定代码如下:
lock (this){ Some statements ;}

·使用Monitor

当有需要进行线程管理的时候可以使用:
Monitor.Enter(this);
其他也有一些方法进行管理,这里就不一一提及了。


线程的缺点
线程自然也有缺点,以下列出了一些:
·如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换;
·更多的线程需要更多的内存空间
·线程会给程序带来更多的bug,因此要小心使用
·线程的中止需要考虑其对程序运行的影响
·通常块模型数据是在多个线程间共享的,需要一个合适的锁系统替换掉数据共享
原创粉丝点击