博文
C#多线程学习(五) 多线程的自动管理(定时器)(2012-12-04 10:38:00)
摘要:
Timer类:设置一个定时器,定时执行用户指定的函数。
定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。
初始化一个Timer对象:
Timer timer = new Timer(timerDelegate, s,1000, 1000);
// 第一个参数:指定了TimerCallback 委托,表示要执行的方法;
// 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用;
// 第三个参数:延迟时间——计时开始的时刻距现在的时间,单位是毫秒,指定为“0”表示立即启动计时器;
// 第四个参数:定时器的时间间隔——计时开始以后,每隔这么长的一段时间,TimerCallback所代表的方法将被调用一次,单位也是毫秒。指定 Timeout.Infinite 可以禁用定期终止。
Timer.Change()方法:修改定时器的设置。(这是一个参数类型重载的方法)
使用示例: timer.Change(1000,2000);
Timer类的程序示例(来源:MSDN):
Code using System; using System.Threading; namespace ThreadExample
{ class TimerExampleState
{ public int counter = 0; public Timer tmr;
} class App
{ public static void Main()
{
TimerExampleState s = new TimerExampleState(); //创建代理对象TimerCallback,该代理将被定时调用 TimerCallback timerDelegate = new TimerCallback(CheckStatus); //创建一个时间间隔为1s的定时器 Timer timer = new Timer(timerDelegate, s,1000, 1000);
s.tmr = timer; //主线程停下来等待......
C#多线程学习(三) 生产者和消费者(2012-12-04 10:36:00)
摘要:
前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。
C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C#中,关键字lock定义如下:
lock(expression) statement_block
expression代表你希望跟踪的对象,通常是对象引用。
如果你想保护一个类的实例,一般地,你可以使用this;
如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。
而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。
下面是一个使用lock关键字的典型例子,在注释里说明了lock关键字的用法和用途。
示例如下:
Code using System; using System.Threading; namespace ThreadSimple
{ internal class Account
{ int balance;
Random r = new Random(); internal Account(int initial)
{
balance = initial;
} internal int Withdraw(int amount)
{ if (balance < 0)
{ //如果balance小于0则抛出异常 throw new Exception("Negative Balance");
} //下面的代码保证在当前线程修改balance的值完成之前 //不会有其他线程也执行这段代码来修改balance的值 //因此,balance的值是不可能小于0 的 lock (this)
......
C#多线程学习(二) 如何操纵一个线程(2012-12-04 10:34:00)
摘要:
下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事)
在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。
打开你的VS.net,新建一个控制台应用程序(Console Application),编写完全控制一个线程的代码示例:
using System; using System.Threading; namespace ThreadTest
{ public class Alpha
{ public void Beta()
{ while (true)
{
Console.WriteLine("Alpha.Beta is running in its own thread.");
}
}
}; public class Simple
{ public static int Main()
{
Console.WriteLine("Thread Start/Stop/Join Sample");
Alpha oAlpha = new Alpha();
file://这里创建一个线程,使之执行Alpha类的Beta()方法 Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));
oThread.Start(); while (!oThread.IsAlive)
Thread.Sleep(1);
oThread.Abort();
oThread.Join();
Console.WriteLine();
C......
C#多线程学习(四) 多线程的自动管理(线程池)(2012-12-04 10:28:00)
摘要:
在多线程的程序中,经常会出现两种情况:
一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应
这一般使用ThreadPool(线程池)来解决;
另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒
这一般使用Timer(定时器)来解决;
ThreadPool类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系统支持,因为其中某些方法调用了只有高版本的Windows才有的API函数。
将线程安放在线程池里,需使用ThreadPool.QueueUserWorkItem()方法,该方法的原型如下:
//将一个线程放进线程池,该线程的Start()方法将调用WaitCallback代理对象代表的函数
public static bool QueueUserWorkItem(WaitCallback);
//重载的方法如下,参数object将传递给WaitCallback所代表的方法
public static bool QueueUserWorkItem(WaitCallback, object);
ThreadPool类是一个静态类,你不能也不必要生成它的对象。而且一旦使用该方法在线程池中添加了一个项目,那么该项目将是无法取消的。
在这里你无需自己建立线程,只需把你要做的工作写成函数,然后作为参数传递给ThreadPool.QueueUserWorkItem()方法就行了,传递的方法就是依靠WaitCallback代理对象,而线程的建立、管理、运行等工作都是由系统自动完成的,你无须考虑那些复杂的细节问题。
ThreadPool 的用法:
首先程序创建了一个ManualResetEvent对象,该对象就像一个信号灯,可以利用它的信号来通知其它线程。
本例中,当线程池中所有线程工作都完成以后,ManualResetEvent对象将被设置为有信号,从而通知主线程继续运行。
ManualResetEvent对象有几个重要的方法:
初始......
C#多线程学习(一) 多线程的相关概念(2012-12-04 10:17:00)
摘要:
什么是进程?
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。
什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
多线程的不利方面:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要CPU时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug;
接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执行过程中的输出。
任何程序在执行时,至少有一个主线程。
一个直观印象的线程示例:
using System; using System.Threading; namespace ThreadTest
{ class RunIt
{
[STAThread] staticvoid Main(string[] args)
{
Thread.CurrentThread.Name="System Thread";//给当前线程起名为"System Thread" Console.WriteLine(Thread.CurrentThread.Name+"'Status:"+Thread.CurrentThread.ThreadState);
Console.ReadLine();
}
}
}......
走过逆境(2012-11-30 15:52:00)
摘要:
逆境和攀登高山是一样的道理。逆境向上是艰难的,但你的位置始终在向高处增长;而下山是顺势朝下的,是不用花费什么力气的,但你是在走下坡路,领略不到高处美妙的风光。
我们的生活里,逆境多于顺境,波折多于平静,这是一种人生规律。就像航行的帆船,需要逆向的风作动力才能乘风破浪向前航行。有波折的生活才富有创造的魅力。
有这样一个寓言故事:说深山里有一只狐狸早先它的尾巴是卷起来的,因为它觉
得自己聪明,没有哪个猎人能够奈何了它。可是有一天,它终于栽到寻摸它已久的猎人手里。被关在笼子里的狐狸没有考虑目前的困境,而是左右思想,自己每天都
小心翼翼做事,怎么会被眼前这个并不聪明的猎人给捕获?这时,一阵风吹过来,它感觉到圈起来的尾巴有了动感。狐狸恍然大悟,原来是不该圈起来的尾巴失去了
它特有的功能。猎人是循着自己的留在雪地上的脚印来的,如果把尾巴放下来,拖在地上轻轻扫动,自己的脚印就能被抹去。于是,它再次与猎人打赌,如果放了
它,三天内猎人是无法找着他的。猎人放了狐狸,从此,猎人再也没有寻找到这只狐狸的脚印。
被逆境所困,抱怨是没有用的。被困,才有所思;有所思,才有所能,有所能才会找到逆境的出口。就像高山无法囤积流水,云朵无法锁住日月。逆境是扭转不了生命本然的真实。反而,驱使我们找到全新的自我。
惊险涡流的形成,是因为水域下面藏着暗礁。流水受到阻力,便形成富有张力的
旋涡进行抗击。涡流的奇观,展现出生命的张力,令人望而生畏。我们身处逆境,好比流水身陷暗礁,只有顽强抗争,才有运动着的生命力。逆境打造了我们生命活
力的运动场,使我们的骨骼更强健,精神更旺盛!
学会在逆境中求生存,要在那些歧视的目光里找回你做人的尊严。受到压抑才知道奋战,受到排挤才知道竞争。弹簧背负着重量的压抑,始终没有放弃反弹的欲望;大颗粒沙砾受到挤压和颠簸,才知道奋力冲在一桶沙砾的最上层。逆境造就抗争,抗争才有动力。
身处逆境是痛苦的,但也是幸运的。因为逆境的口袋里藏有珍贵的财富,在你熬
过最艰难的关口时,你会意外地得到这笔丰厚的资产。我们可以观察到,作茧的蚕用心血吐出的丝自缚住身体,整个吐丝的过程是痛苦的,而最后把自己的身体包裹
进蚕丝更是倍受煎熬的。然而,用不了多长时间,破茧而出的蛾便获得飞舞的自由。
......
六十六条经典禅语,你必须控制现在(2012-11-29 15:03:00)
摘要:1. 人之所以痛苦,在于追求错误的东西。
2. 如果你不给自己烦恼,别人也永远不可能给你烦恼。因为你自己的内心,你放不下。
3. 你永远要感谢给你逆境的众生。
4. 你永远要宽恕众生,不论他有多坏,甚至他伤害过你,你一定要放下,才能得到真正的快乐。
5. 当你快乐时,你要想这快乐不是永恒的。当你痛苦时,你要想这痛苦也不是永恒的。
6. 今日的执著,会造成明日的后悔。
7. 你可以拥有爱,但不要执著,因为分离是必然的。
8. 不要浪费你的生命在你一定会后悔的地方上。
9. 你什么时候放下,什么时候就没有烦恼。
10. 每一种创伤,都是一种成熟。
11. 狂妄的人有救,自卑的人没有救,认识自己,降伏自己,改变自己,才能改变别人。
12. 你不要一直不满人家,你应该一直检讨自己才对。不满人家,是苦了你自己。
13. 一个人如果不能从内心去原谅别人,那他就永远不会心安理得。
14. 心中装满着自己的看法与想法的人,永远听不见别人的心声。
15. 毁灭人只要一句话,培植一个人却要千句话,请你多口下留情。
16. 根本不必回头去看咒骂你的人是谁?如果有一条疯狗咬你一口,难道你也要趴下去反咬他一口吗?
17. 永远不要浪费你的一分一秒,去想任何你不喜欢的人。
18. 请你用慈悲心和温和的态度,把你的不满与委屈说出来,别人就容易接受。
19. 同样的瓶子,你为什么要装毒药呢?同样的心里,你为什么要充满着烦恼呢?
20. 得不到的东西,我们会一直以为他是美好的,那是因为你对他了解太少,没有时间与他相处在一起。当有一天,你深入了解后,你会发现原不是你想像中的那么美好。
21. 活着一天,就是有福气,就该珍惜。当我哭泣我没有鞋子穿的时候,我发现有人却没有脚。
22. 多一分心力去注意别人,就少一分心力反省自己,你懂吗?
23. 憎恨别人对自己是一种很大的损失。
24. 每一个人都拥有生命,但并非每个人都懂得生......
使用相对Url无缝切换HTTP-HTTPS(2012-11-24 11:44:00)
摘要:
概述
在HTTPS的网站下,如果要访问HTTP资源,那么一般浏览器会弹出窗口询问用户是否允许加载不安全内容,云云。为了避免出现这样干扰用户的情况,所有网页下请求的资源都都必须是HTTPS资源。如果你的站点支持HTTP和HTTPS两种方式访问,而实际网站只有一份的话,这种情况下,你可以使用相对Url的方式改写网页内资源的请求Url。
省略Scheme的相对Url语法
Url相对路径我们并不陌生,下面这样的写法非常常见。
<img src='/images/myphoto.jpg' /> <img src='myphoto.jpg' />
如果该HTML代码放在http://myexample.com/myblog/index.html上,那么第一幅图片的实际完整地址就是http://myexample.com/images/myphoto.jpg,而第二幅图片的实际地址是http://myexample.com/myblog/myphoto.jpg。
但是省略Url中的Scheme部分这样的相对路径写法却比较少见。例如:
<img src='//myimagehosting.com/images/myphoto.jpg' />
这行代码如果放在HTTP的网页上,那么请求的资源就是HTTP://myimagehosting.com/images/myphoto.jpg,如果放在HTTPS上,则访问的资源就是HTTPS的。这样一来我们就无需为HTTP和HTTPS各自准备不同的网页了。
标准规范
RFC1808文档是专门针对相对URI的,其中提到,除了URI中的Scheme部分,其他部分均可以做适当的省略。也就是说,这样的写法是不符合规范。RFC1808文档是95年的时候定稿的。后来的RFC3986文档对URI做出了更为详细的规范,废弃了RFC1808对相对URI引用的建议规范(4.2 Relative Reference一节)。
以Scheme:开头的(如http:、file:、ftp:)均为绝对URI引用。否则......
利用https实现站点访问(2012-11-24 11:37:00)
摘要:
一、https的简介
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议。它是由 Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。。
https是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,https的安全基础是SSL,因此加密的详细内容请看SSL。
它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
HTTPS和HTTP的区别
1、https协议需要到ca申请证书,一般免费证书很少,需要交费。
2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
二、SSL的简介
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之......
生活在感恩的世界里(2012-11-22 21:12:00)
摘要:
生活在感恩的世界里(净空法师)
感激伤害你的人——因为他磨炼了你的心志
感激欺骗你的人——因为他增进了你的见识
感激鞭打你的人——因为他消除了你的业障
感激遗弃你的人——因为他教导了你应自立
感激绊倒你的人——因为他强化了你的能力
感激斥责你的人——因为他提升了你的定慧
感激所有使你坚定成就的人
●纵遇魔障也感恩(真如妙心和诗)
感激诽谤你的人——因为他成就了你的忍辱
感激攻击你的人——因为他洗刷了你的罪迹
感激伤害你的人——因为他化解了你的苦毒
感激侮辱你的人——因为他填平了你的地狱
感激诬陷你的人——因为他巩固了你的戒律
感激驱逐你的人——因为他成全了你的出离
感激折磨你的人——因为他拓宽了你的净土
感激所有使你脱离火宅的人,他们是大慈若恨、望子成佛的前生父母
感激所有使你回归净土的人,他们是同体大悲、化身度我的未来佛祖
解铃还须系铃人,善待外侮须感恩;
仰天唾空终自受,心包太虚无风云!
人的一生中,小而言之,从小时候起,就领受了父母的养育之恩,等到上学,有老师
的教育之恩,工作以后,又有领导、同事的关怀、帮助之恩,年纪大了之后,又免不了要接受晚辈的赡养、照顾之恩;大而言之,作为单个的社会成员,我们都生活
在一个多层次的社会大环境之中,都首先从这个大环境里获得了一定的生存条件和发展机会,也就是说,社会这个大环境是有恩于我们每个人的。感恩,说明一个人
对自己与他人和社会的关系有着正确的认识;报恩,则是在这种正确认识之下产生的一种责任感。没有社会成员的感恩和报恩,很难想象一个社会能够正常发展下
去。在感恩的空气中,人们对许多事情都可以平心静气;在感恩的空气中,人们可以认真、务实地从最细小的一件事做起;在感恩的空气中,人们自发地真正做到严
于律已宽以待人;在感恩的空气中,人们正视错误,互相帮助;在感恩的空气中,人们将不会感到自己的孤独……
人生道路,曲折坎坷,不知有多少艰难险阻,甚至遭遇挫折和失败。在危困时刻,有
人向你伸出温暖的双......