Illustrates how to create and start threads using .Net thread library.
/////////////////////////////////////////////////////////////////////
// StartingThreads.cs - demo of thread delegates //
// //
// Jim Fawcett, CSE681 - Software Modeling and Analysis, Summer 09 //
/////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace StartingThreads
{
class DemoThreads
{
string msg_ = null;
DemoThreads(string msg) { msg_ = msg; }
public void newMessage(string msg) { msg_ = msg; }
void ThreadProc() // ThreadStart delegate accepts this signature
{
MsgProc(msg_);
}
void MsgProc(string msg)
{
Console.Write("\n {0}", msg as string);
}
void ObjProc(object msg) // ParameterizedThreadStart accepts this signature
{
Console.Write("\n {0}", msg as string);
}
static void Main(string[] args)
{
int count = 0;
// Explicit use of ThreadStart delegate
DemoThreads p = new DemoThreads(String.Format("message #{0}", ++count));
ThreadStart ts = new ThreadStart(p.ThreadProc);
Thread t1 = new Thread(ts);
t1.Start();
t1.Join(); // if you remove this you may not see message #1
// due to race condition with next statement, below.
// Implicit use of ThreadStart delegate uses type inference
p.newMessage(String.Format("message #{0}", ++count));
Thread t1b = new Thread(p.ThreadProc);
t1b.Start();
// Explicit use of ParameterizedThreadStart delegate
ParameterizedThreadStart pts = new ParameterizedThreadStart(p.ObjProc);
Thread t2 = new Thread(pts);
t2.Start(String.Format("message #{0}", ++count));
// Implicit use of ParameterizedThreadStart delegate via type inference
Thread t2b = new Thread(p.ObjProc);
t2b.Start(String.Format("message #{0}", ++count));
//////////////////////////////////
// This doesn't work:
//Action<string> starter = new Action<string>(p.MsgProc);
//Thread t3 = new Thread(starter);
//t3.Join();
// Implicit use of ParameterizedThreadStart via type inference
Thread t2c = new Thread((msg) => p.ObjProc(msg));
t2c.Start(String.Format("message #{0}", ++count));
t1.Join();
t1b.Join();
t2.Join();
t2b.Join();
t2c.Join();
Console.Write("\n\n");
}
}
}