启动一个线程最通常的做法如下:
ThreadStart ts1
=
new
ThreadStart(bo.DoWork);
Thread t
=
new
Thread(ts1);
t.Start();
.net中有一种隐式使用线程的方式,这种方式在上一章已经提到过了。
通过线程池可以隐式地创建线程,这些线程是受CLR控制的,我们不能直接控制。
CalculationHandler slowAddHandler
=
new
CalculationHandler(math.SlowAdd);
IAsynResult ar
=
slowAddHandler.BeginInvoke(
4
,
3
,
null
,
null
);

Thread.Sleep()方法可以让当前线程休眠一定的时间。

public
void
DoWork()
{
if (mustSleep)
{
Thread.Sleep(1000);
}
}
Thread.Sleep(-1) 可以让当前线程无限期的等待下去;
Thread.Sleep(0) 让当前线程让出一次执行机会给其他线程。
(顺便说:CLR会不会把这一次机会给其它进程的线程?想来机会属于进程的,如果进程内的其它线程不需要的话,机会还是会还给这个线程的。)
Thread.Interrupt 方法可以唤醒一个休眠的线程,但是会使休眠的线程抛出ThreadInterruptedException异常。
static
void
Main()
{
ThreadStart ts = new ThreadStart(DoWork);
Thread t = new Thread(t);
t.Start();
// do something
t.Interrupt();
}

public
void
DoWork()
{
try
{
Console.WriteLine("Do some Work!");
Thread.Sleep(-1);
}
catch (ThreadInterruptedException tie)
{
Console.WriteLine("被唤醒" + tie.Message);
}
finally
{
// do something
}
}
有时主线程执行完任务后要退出系统的时候,其它线程可能还没有执行完,如果主线程退出了就会诱发异常,而且还有可能会丢失一些数据。
这个时候我们可以用 Thread.Join() 方法让当前线程等待某线程的执行。
static
void
Main()
{
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.Start();
t2.Start();
// do something
t1.Join(); // 主线程停在这里等t1执行完
t2.Join(); // 主线程停在这里等t2执行完
Console.WriteLine("两个线程都执行完了");
}
线程执行完后,调用线程的 IsAlive 方法会得到返回值 false,说明线程已经执行完。
Join() 重载方法可以设定等待的最大时间,如果超过时间还没有结束Join方法将返回false,说明线程还在运行并且取消阻塞继续执行后续的语句。
我们可以调用 Abort 方法关闭线程,但是与此线程绑定的方法将抛出ThreadAbortException异常。调用 Abort 方法后应该留出一些时间来给线程,用来释放资源。
static
void
Main()
{
ThreadStart ts = new ThreadStart(DoWork);
Thread t = new Thread(t);
t.Start();
// do something
t.Abort();
t.Join();
}



.net中有一种隐式使用线程的方式,这种方式在上一章已经提到过了。
通过线程池可以隐式地创建线程,这些线程是受CLR控制的,我们不能直接控制。












Thread.Sleep(-1) 可以让当前线程无限期的等待下去;
Thread.Sleep(0) 让当前线程让出一次执行机会给其他线程。
(顺便说:CLR会不会把这一次机会给其它进程的线程?想来机会属于进程的,如果进程内的其它线程不需要的话,机会还是会还给这个线程的。)
Thread.Interrupt 方法可以唤醒一个休眠的线程,但是会使休眠的线程抛出ThreadInterruptedException异常。

























有时主线程执行完任务后要退出系统的时候,其它线程可能还没有执行完,如果主线程退出了就会诱发异常,而且还有可能会丢失一些数据。
这个时候我们可以用 Thread.Join() 方法让当前线程等待某线程的执行。











线程执行完后,调用线程的 IsAlive 方法会得到返回值 false,说明线程已经执行完。
Join() 重载方法可以设定等待的最大时间,如果超过时间还没有结束Join方法将返回false,说明线程还在运行并且取消阻塞继续执行后续的语句。
我们可以调用 Abort 方法关闭线程,但是与此线程绑定的方法将抛出ThreadAbortException异常。调用 Abort 方法后应该留出一些时间来给线程,用来释放资源。









