Purpose
Many times the Application needs to be notified about what is happening inside a
Thread. For this, Events can be used with Threads. This is what I call 'Live
Threads'.
Implementation Details
Consider a Thread which does the countdown starting from a user specified
number. The Application wants to know each time a countdown has been done so
that it can print the value to the UI. This can be done via Events.
The Class which does the Count Down is the CountDownDriver class. This class
exposes two custom Events viz.
#region Custom
Event Delegates
public delegate
void CountDown(object
o, EventArgs e);
public delegate
void
CountDownComplete(object o,
EventArgs e);
#endregion
#region
Custom Events
public event
CountDown OnCountDown;
public event
CountDownComplete OnCountDownComplete;
#endregion
The OnCountDown event is fired by thread after each count down. The
OnCountDownComplete event is fired after the countdown is complete.
public void
StartCountDown()
{
for (int
i = Count; Count >= 0; Count--)
{
Thread.Sleep(300);
if (Count <= 0)
{
//Fire OnCountDownComplete Event
if (OnCountDownComplete
!= null)
{
OnCountDownComplete(this,
new EventArgs());
}
break;
}
//Fire
OnCountDown Event
if (OnCountDown !=
null)
{
OnCountDown(Count, new
EventArgs());
}
}
}
When the Application launches the Thread, these Events are mapped to Event
Handlers in the Application.
CountDownDriver threadDriver =
new CountDownDriver
{
Count = int.Parse(this.textBox1.Text)
};
threadDriver.OnCountDown += new
CountDownDriver.CountDown(threadDriver_OnCountDown);
threadDriver.OnCountDownComplete += new
CountDownDriver.CountDownComplete(threadDriver_OnCountDownComplete);
new Thread(()
=> threadDriver.StartCountDown()).Start();
Thus, when these Events are fired inside the Threads, the Application is
notified and the Event Handler executes. In this demo, the code in the Event
Handlers prints to the UI. Note: Invoke has to be used to acquire the UI Thread
first before writing to it.
void threadDriver_OnCountDown(object
o, EventArgs e)
{
int Count = (int)o;
this.Invoke(new
MethodInvoker(delegate()
{ this.richTextBox1.Text =
this.richTextBox1.Text +
"\n"
+ "Count
Down : " + Count.ToString();
}));
}