1. 程式人生 > >C# 4.0 新特性之命名引數和可選引數, 動態繫結(dynamic), 泛型協變和逆變, CountdownEvent, Barrier

C# 4.0 新特性之命名引數和可選引數, 動態繫結(dynamic), 泛型協變和逆變, CountdownEvent, Barrier

/*
 * CountdownEvent - 執行緒、任務同步類。執行緒或任務一直阻塞到 CountdownEvent 的計數為 0 為止
 * 1、當有新的需要同步的執行緒或任務產生時,就呼叫 AddCount 增加 CountdownEvent 的計數
 * 2、當有執行緒或任務到達同步點時,就呼叫 Signal 函式減小 CountdownEvent 的計數
 * 3、當 CountdownEvent 的計數為 0 時,就表示所有需要同步的任務已經完成。通過 Wait 來阻塞執行緒
 
*/using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Threading;

namespace CSharp
{
    
publicpartialclass CountdownEventDemo : System.Web.UI.Page
    {
        
privatestring _result ="";

        
privatestaticreadonlyobject objLock =newobject();

        
protectedvoid Page_Load(object
 sender, EventArgs e)
        {
            
// CountdownEvent(int initialCount) - 例項化一個 CountdownEvent
            
//     int initialCount - 初始計數using (var countdown =new CountdownEvent(1))
            {
                Thread t1 
=new Thread(() => ThreadWork("aaa", TimeSpan.FromSeconds(1), countdown));
                
// 增加 1 個計數                countdown.AddCount();
                t1.Start();

                Thread t2 
=new Thread(() => ThreadWork("bbb", TimeSpan.FromSeconds(2), countdown));
                countdown.AddCount();
                t2.Start();

                Thread t3 
=new Thread(() => ThreadWork("ccc", TimeSpan.FromSeconds(3), countdown));
                countdown.AddCount();
                t3.Start();

                
// 減少 1 個計數                countdown.Signal();
                
// 阻塞當前執行緒,直到 CountdownEvent 的計數為零                countdown.Wait();
            }

            Response.Write(_result);
        }

        
privatevoid ThreadWork(string name, TimeSpan sleepTime, CountdownEvent countdown)
        {
            Thread.Sleep(sleepTime);

            _result 
+="hello: "+ name +""+ DateTime.Now.ToString("HH:mm:ss");
            _result 
+="<br />";

            
// 減少 1 個計數            countdown.Signal();
        }
    }
}

/*
執行結果:
hello: aaa 15:18:55
hello: bbb 15:18:56
hello: ccc 15:18:57
*/