您的位置:首页 > 编程语言 > C#

C# 让线程变得简单咯

2008-01-27 21:06 274 查看
[为什么要千头万绪]

一次伟大的改良....

举例来说,单线程就像超市的唯一收银员;多线程像是一群收银员,每一个人负责一条柜台。某些柜台负责专门的大买家的服务,其他柜台处理小的零售。一条线瘫痪了,并不会影响其他的柜台。恩。。跟在银行、电信的营业厅办理业务的时候也差不多,大家取号排队,到各自的专门的业务窗口办理自己的业务。

So。。简单的说:

多线程,使程序得以将其工作分开,独立运作,不互相影响。

告别MS-DOS,告别MS-3.X,告别MS-Win32,迎来了DotNET框架。

So。。

[C#编写多线程开始了.]

启动与中断线程的问题:

线程的状态表示为 Thread.ThreadState 的枚举类型,Aborted 线程更具中断请求而中断,AbortRequested 另一个线程请求该线程终止,Suspended 线程被挂起,.......等等.......

[align=center][/align]


using System;




using System.Threading;




public class ThreadExample




...{




// The ThreadProc method is called when the thread starts.


public static void ThreadProc()




...{


for (int i = 0; i < 10; i++)




...{


Console.WriteLine("ThreadProc: {0}", i);


// Yield the rest of the time slice.


Thread.Sleep(0);


}


}


public static void Main()




...{


Console.WriteLine("Main thread: Start a second thread.");


// Thread 构造函数可接收ThreadStart委托作为参数。


//当线程执行就会被调用,而且作为线程开始执行的位置


Thread t = new Thread(new ThreadStart(ThreadProc));


// Start ThreadProc. 调用t.Start方法启动一个线程


t.Start();


//Thread.Sleep(0);


for (int i = 0; i < 4; i++)




...{


Console.WriteLine("Main thread: Do some work.");


Thread.Sleep(0);


}


Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");


t.Join();


Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");


Console.ReadLine();


}


}





调度一个线程的问题:

每个线程都具有分配给它的线程优先级。在公共语言运行库中创建的线程最初分配的优先级为 ThreadPriority.Normal。在运行库以外创建的线程保留它们在进入托管环境之前具有的优先级。可以使Thread.Priority 属性获取或设置任何线程的优先级。

最后销毁一个线程的问题:

Thread.Abort 方法用于永久地停止逻辑线程。当调用 Abort 时,公共语言运行库引发一个 ThreadAbortException,线程可捕捉到此异常。有关更多信息,请参见 Thread.Abort

由于 Thread.Abort 不会使线程立即中止,因此如果需要确保线程被停止,则必须调用 Thread.Join 以在该线程上等待。Join 是一个阻塞调用,该调用直到线程实际停止执行后才会返回。一旦线程被中止,它将无法重新启动。

您还可以调用 Thread.Join 并传递超时时间段。如果线程在超时结束之前死亡,该调用将返回 true。否则,如果该时间在线程死亡之前过期,则该调用将返回 false。在对 Thread.Join 的调用上等待的线程可以被调用 Thread.Interrupt 的其他线程中断。

[设计线程的准则]

使用多线程时要考虑以下准则:

n 不要使用 Thread.Abort 终止其他线程。对另一个线程调用 Abort 无异于引发此线程的异常,而且将不知道此线程已处理到哪一点。
n 不要使用 Thread.SuspendThread.Resume 来同步多个线程的活动。使用 Mutex, ManualResetEventAutoResetEventMonitor
n 不要从主程序中控制辅助线程的执行(比如使用事件),而应在设计程序时让辅助线程负责等待任务,执行任务,并在完成时通知程序的其他部分。如果辅助线程不阻塞,请考虑使用线程池线程。Monitor.PulseAll 在辅助线程阻塞的情况下会很有用。
n 一定要确保已进入监视器的线程总离开此监视器,即使当线程在监视器中时发生异常时也是如此。C# 的 lock 语句和 Visual Basic 的 SyncLock 语句可自动提供此行为,它们用一个 finally 块来确保调用 Monitor.Exit。如果无法确保将调用 Exit,请考虑将您的设计更改为使用 Mutex。Mutex 在当前拥有它的线程终止后会自动释放。
n 一定要针对那些需要不同资源的任务使用多线程,避免向单个资源指定多个线程。例如,任何涉及 I/O 的任务都会从拥有其自己的线程这一点得到好处,因为此线程在 I/O 操作期间将阻塞,从而允许其他线程执行。用户输入是另一种可从专用线程获益的资源。在单处理器计算机上,涉及大量计算的任务可与用户输入和涉及 I/O 的任务并存,但多个计算量大的任务将相互竞争。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: