应用框架的设计与实现——.NET平台(8.1 Windows服务.线程)
来源:互联网 发布:淘宝网网页版登录网址 编辑:程序博客网 时间:2024/05/21 11:16
启动一个线程最通常的做法如下:
.net中有一种隐式使用线程的方式,这种方式在上一章已经提到过了。
通过线程池可以隐式地创建线程,这些线程是受CLR控制的,我们不能直接控制。
Thread.Sleep(-1) 可以让当前线程无限期的等待下去;
Thread.Sleep(0) 让当前线程让出一次执行机会给其他线程。
(顺便说:CLR会不会把这一次机会给其它进程的线程?想来机会属于进程的,如果进程内的其它线程不需要的话,机会还是会还给这个线程的。)
Thread.Interrupt 方法可以唤醒一个休眠的线程,但是会使休眠的线程抛出ThreadInterruptedException异常。
有时主线程执行完任务后要退出系统的时候,其它线程可能还没有执行完,如果主线程退出了就会诱发异常,而且还有可能会丢失一些数据。
这个时候我们可以用 Thread.Join() 方法让当前线程等待某线程的执行。
线程执行完后,调用线程的 IsAlive 方法会得到返回值 false,说明线程已经执行完。
Join() 重载方法可以设定等待的最大时间,如果超过时间还没有结束Join方法将返回false,说明线程还在运行并且取消阻塞继续执行后续的语句。
我们可以调用 Abort 方法关闭线程,但是与此线程绑定的方法将抛出ThreadAbortException异常。调用 Abort 方法后应该留出一些时间来给线程,用来释放资源。
ThreadStart ts1 = new ThreadStart(bo.DoWork);
Thread t = new Thread(ts1);
t.Start();
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);
}
}
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
}
}
{
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("两个线程都执行完了");
}
{
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();
}
{
ThreadStart ts = new ThreadStart(DoWork);
Thread t = new Thread(t);
t.Start();
// do something
t.Abort();
t.Join();
}
- 应用框架的设计与实现——.NET平台(8.1 Windows服务.线程)
- 应用框架的设计与实现——.NET平台(8.2 Windows服务)
- 应用框架的设计与实现——.NET平台(5 缓存服务.源码分析)
- 应用框架的设计与实现——.NET平台(7.事件通知服务.源码分析)
- 应用框架的设计与实现——.NET平台(9 消息队列服务代码分析)
- 应用框架的设计与实现——.NET平台(10 授权服务.Attribute)
- 应用框架的设计与实现——.NET平台(10 授权服务.PrincipalPermissionAttribute)
- 应用框架的设计与实现——.NET平台(10 授权服务.CodeAccessSecurityAttribute)
- 应用框架的设计与实现——.NET平台(10 授权服务.源码分析)
- 应用框架的设计与实现——.NET平台(7.事件通知服务.委托.异步编程)
- 应用框架的设计与实现.net平台--跨领域组件--服务工厂
- .NET平台应用框架设计与实现
- 应用框架的设计与实现——.NET平台(1)
- 应用框架的设计与实现——.NET平台(2)
- 应用框架的设计与实现——.NET平台(3)
- 应用框架的设计与实现——.NET平台(4)
- 应用框架的设计与实现——.NET平台4.2代码测试
- 应用框架的设计与实现——.NET平台4.2代码测试问题解决
- 如何建立linux交叉编译器(来自网络的相关帖子)
- C#处理文本文件(转 by:nowave)《以下的打印和打印预览比较的有价值》
- preempt_count()
- 数据转换
- 检查给定目录是否存在,如果不存在则创建该目录
- 应用框架的设计与实现——.NET平台(8.1 Windows服务.线程)
- 判断是否有当前实例运行
- 写一个关闭显示器的小程序
- 3G对中国无线数据业务的影响!
- 木马编程,一些好玩的程序
- 一款新的RSS收藏阅读软件
- 为DataGrid的自带分页添加首页、尾页及状态功能
- 有一种美叫放弃
- MYSQL数据类型长度 常规的建库策略