public void Run()
{
for(;;)
{
// ngng 10 giây
Thread.Sleep( 10 );
// ly thi gian hin hành
System.DateTime dt = System.DateTime.Now;
// nếu giây thay đổi cnh báo cho subscriber
if ( dt.Second != second)
{
// to TimeInfoEventArgs để truyn
// cho subscriber
TimeInfoEventArgs timeInformation =
new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second);
// nếu có bt c lp nào đăng ký thì cnh báo
if ( OnSecondChange != null)
{
OnSecondChange( this, timeInformation);
}
}
// cp nht trng thái
this.second = dt.Second;
this.minute = dt.Minute;
this.hour = dt.Hour;
}
}
Phương thc Run to vòng lp vô hn để kim tra định k thi gian h thng. Nếu
thi gian thay đổi t đối tượng Clock hin hành, thì nó s cnh báo cho tt c các
subscriber và sau đó cp nht li nhng trng thái ca nó.
Bước đầu tiên là ngng 10 giây:
Thread.Sleep(10);
đây chúng ta s dng phương thc tĩnh ca lp Thread t System.Threading ca .NET.
S dng phương thc Sleep() để kéo dài khong cách gia hai ln thc hin vòng lp.
Sau khi ngng 10 mili giây, phương thc s kim tra thi gian hin hành:
System.DateTime dt = System.DateTime.Now;
C khong 100 ln kim tra, thì mt giây s đưc gia tăng. Phương thc ghi nhn s
thay đổi
và cnh báo đến nhng subscriber ca nó. Đểm được điu này, đầu tiên phi to ra
mt đối tượng TimeInfoEventArgs:
if ( dt.Second != second)
{
// to TimeInfoEventArgs để truyn cho các subscriber
TimeInfoEventArgs timeInformation =
new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second);
}
để cnh báo cho nhng subscriber bng cách kích hot s kin OnSecondChange:
// cnh báo cho các subscriber
if ( OnSecondChange != null)
{
OnSecondChange( this, timeInformation);
}
Nếu mt s kin không có bt c lp subscriber nào đăng ký thì nó ước lượng giá tr
null. Phn kim tra bên trên xác định giá tr ca s kin có phi là null hay không, để đảm
bo rng
có tn ti lp đăng ký nhn s kin trước khi gi s kin OnSecondChange.
Chúng ta lưu ý rng OnSecondChange ly hai tham s: ngun phát ra s kin và đối
tượng dn xut t lp EventArgs. đây chúng ta có th thy rng tham chiếu this
ca lp clock đưc truyn bi vì clock là ngun phát ra s kin. Tham s th hai là
đối tượng TimeInfo- EventArgs được to ra dòng lnh bên trên.
Mt s kin được phát ra thì s gi bt c phương thc nào được đăng ký vi lp Clock
thông qua delegate, chúng ta s kim tra điu này sau.
Mt khi mà s kin được phát ra, chúng ta s cp nht li trng thái ca lp Class:
this.second = dt.Second;
this.minute = dt.Minute;
this.hour = dt.Hour;
Sau cùng là chúng ta xây dng nhng lp có th đăng ký vào các s kin này. Chúng ta
s to
hai lp. Lp đầu tiên là lp DisplayClock. Chc năng chính ca lp này không phi là
lưu gi thi gian mà ch để hin th thi gian hin hành ra màn hình console. Để đơn
gin chúng ta
ch to hai phương thc cho lp này. Phương thc th nht có tên là Subscribe,
phương thc chu trách nhim đăng ký mt s kin OnSecondChange ca lp Clock.
Phương thc th hai đưc to ra là trình x s kin TimeHasChanged:
public class DisplayClock
{
public void Subscrible(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(TimeHasChanged);
}
public void TimeHasChanged( object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine(“Current Time:
{0]:{1}:{2}”, ti.hour.ToString(),
ti.minute.ToString(),
ti.Second.ToString());
}
}
Khi phương thc đầu tiên Subscribe được gi, s to ra mt delegate
SecondChange- Handler mi, và truyn vào phương thc x lý s kin
TimeHasChanged ca nó. Sau đó nó s đăng ký delegate vi s kin OnSecondChange
ca Clock.
Lp th hai mà chúng ta to cũng s đáp ng s kin này, tên là LogCurrentTime.
Thông thường lp này ghi li s kin vào trong tp tin, nhưng vi mc đích minh ha
ca chúng ta, nó s ghi ra màn hình console:
public class LogCurrentTime
{
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(WriteLogEntry);
}
// thông thường phương thc này viết ra file
// nhưng trong minh ha này chúng ta ch xut
// ra màn hình console mà thôi
public void WriteLogEntry( object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine(“Logging to file:
{0}:{1}:{2}”, ti.hour.ToString(),
ti.minute.ToString(),
ti.second.ToString());
}
}
Ghi chú rng nhng s kin được thêm vào bng cách s dng toán t +=. Điu này cho
phép nhng s kin mi được thêm vào s kin OnSecondChange ca đối tượng Clock
mà không
có phá hy bt c s kin nào đã được đăng ký. Khi LogCurrentTime đăng ký mt
s kin OnSecondChange, chúng ta không mun vic đăng ký này làm mt đi s
đăng ký ca lp DisplayClock trước đó.
Tt c phn còn li cn thc hin là to ra mt lp Clock, to m đối tượng
DisplayClock và bo nó đăng ký s kin. Sau đó chúng ta to ra mt đối tượng
LogCurrentTime và cũng đăng