C# 让线程变得简单咯

来源:互联网 发布:linux浏览器 编辑:程序博客网 时间:2024/05/16 09:14

[为什么要千头万绪]

一次伟大的改良....

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

  So。。简单的说:

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

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

  So。。

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

启动与中断线程的问题:

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


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.Suspend Thread.Resume 来同步多个线程的活动。使用 Mutex, ManualResetEventAutoResetEvent Monitor

n          不要从主程序中控制辅助线程的执行(比如使用事件),而应在设计程序时让辅助线程负责等待任务,执行任务,并在完成时通知程序的其他部分。如果辅助线程不阻塞,请考虑使用线程池线程。Monitor.PulseAll 在辅助线程阻塞的情况下会很有用。

n          一定要确保已进入监视器的线程总离开此监视器,即使当线程在监视器中时发生异常时也是如此。C# lock 语句和 Visual Basic SyncLock 语句可自动提供此行为,它们用一个 finally 块来确保调用 Monitor.Exit。如果无法确保将调用 Exit,请考虑将您的设计更改为使用 MutexMutex 在当前拥有它的线程终止后会自动释放。

n          一定要针对那些需要不同资源的任务使用多线程,避免向单个资源指定多个线程。例如,任何涉及 I/O 的任务都会从拥有其自己的线程这一点得到好处,因为此线程在 I/O 操作期间将阻塞,从而允许其他线程执行。用户输入是另一种可从专用线程获益的资源。在单处理器计算机上,涉及大量计算的任务可与用户输入和涉及 I/O 的任务并存,但多个计算量大的任务将相互竞争。

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 陶瓷洗手台裂了怎么办 洗车泵水管坏了怎么办 印胶浆里面渗入了发泡浆怎么办? 管子断在水管里怎么办 衣服上的织带缩水怎么办 真丝衣服拔缝了怎么办 顾客说衣服太花怎么办 铝和碱反应变黑怎么办 40度高温多肉怎么办 沾到医用蓝药水怎么办? 裤子弄上泡沫胶怎么办 苍蝇纸粘衣服上怎么办 苍蝇胶沾衣服上怎么办 灯带为什么不亮怎么办 苹果6比屏幕变黄怎么办 雷腾键盘锁了怎么办 自吸泵电机不转怎么办 孕38周胎儿偏小怎么办 被火烧黑的铁怎么办 锅被烟熏黑了怎么办 墙壁被烟熏黑了怎么办 壁纸被烟熏黑了怎么办 空调被烟熏黑了怎么办 牙被烟熏黑了怎么办 尖头鞋把尖折了怎么办 腰椎固定手术钢钉断了怎么办 脚被钢钉扎了怎么办 皮帘子有胶了怎么办 12v插口没有电怎么办 吃了一颗聚乙烯醇怎么办 立式注塑机产品粘膜怎么办 被小松鼠咬了怎么办 被宠物松鼠咬了怎么办 手被松鼠咬出血怎么办 银联认证码失败怎么办 国际汇款触发合规查询怎么办 外面的网线断了怎么办 网线被别的车挂断了怎么办 施工挖断军用光缆怎么办 不小心挖断光缆怎么办 家里的光纤断了怎么办