C# 4.0 新特性之命名引數和可選引數, 動態繫結(dynamic), 泛型協變和逆變, CountdownEvent, Barrier
阿新 • • 發佈:2019-01-26
/*
* 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
*/
* 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.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
{
// CountdownEvent(int initialCount) - 例項化一個 CountdownEvent
// int initialCount - 初始計數using (var countdown =new CountdownEvent(1))
{
Thread t1 =new Thread(() => ThreadWork("aaa", TimeSpan.FromSeconds(1), countdown));
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
*/