应用框架的设计与实现——.NET平台(8.1 Windows服务.线程)

来源:互联网 发布:淘宝网网页版登录网址 编辑:程序博客网 时间:2024/05/21 11:16
启动一个线程最通常的做法如下:

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(43nullnull);

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();
}


 
原创粉丝点击