EasyText, EasyLicense 的作者, https://github.com/EasyHelper Good Good Study,Day Day Up.

 

05 2011 档案

摘要:Signaling with Wait and Pulse(等待和暂停的信号)早期谈论过等待事件句柄(调用Wait的线程在没有收到另一个线程的通知前会一直阻塞)。Monitor借助它的静态方法Wait,Pulse,PulseAll提供了一个更给力的信号构造,使用这些方法和lock语句,你可以自己实现AutoResetEvent,ManualResetEvent和Semaphore。甚至WaitHandle的WaitAll和WaitAny方法了。怎样使用Wait 和Pulse ?1:定义一个同步对象,例如: Readonly object _locker=new object();2:定义自己的 阅读全文
posted @ 2011-05-31 06:31 LoveJenny 阅读(3887) 评论(1) 推荐(3) 编辑
摘要:在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤: 1. 将实例变量中的值加载到寄存器中。2. 增加或减少该值。3. 在实例变量中存储该值。在多线程环境下,线程会在执行完前两个步骤后被抢先。然后由另一个线程执行所有三个步骤,当第一个线程重新开始执行时,它覆盖实例变量中的值,造成第二个线程执行增减操作的结果丢失。Interlocked可以为多个线程共享的变量提供原子操作。Interlocked.Increment:以原子操作的形式递增指定变量的值并存储结果。Interlocked.Decrement以原子操作的形式递减指定变量的值并存储结果。Interlocked.Add以原子操 阅读全文
posted @ 2011-05-30 06:29 LoveJenny 阅读(5918) 评论(5) 推荐(4) 编辑
摘要:以前我们说过在一些简单的例子中,比如为一个字段赋值或递增该字段,我们需要对线程进行同步,虽然lock可以满足我们的需要,但是一个竞争锁一定会导致阻塞,然后忍受线程上下文切换和调度的开销,在一些高并发和性能比较关键的地方,这些是不能忍受的。.net framework 提供了非阻塞同步构造,为一些简单的操作提高了性能,它甚至都没有阻塞,暂停,和等待线程。Memory Barriers and Volatility (内存栅栏和易失字段 )考虑下下面的代码: int_answer;bool_complete;voidA(){_answer=123;_complete=true;}voidB(){i 阅读全文
posted @ 2011-05-29 08:54 LoveJenny 阅读(9639) 评论(18) 推荐(7) 编辑
摘要:在Framework中存在着4种定时器:其中分为两类,多线程计时器1:System.Threading.Timer2:System.Timers.Timer特殊目的的单线程计时器:1:System.Windows.Forms.Timer(Windows Forms Timer)2:System.Windows.Threading.DispatcherTimer(WPF timer);多线程计时器比较强大,精确,而且可扩展性强;单线程计时器比较安全,对于更新 Windows Forms controls或者WPF这种简单任务来说更方便。System.Threading.Timer是最简单的多线程 阅读全文
posted @ 2011-05-28 09:28 LoveJenny 阅读(16131) 评论(11) 推荐(8) 编辑
摘要:Event-based asynchronous(EAP)在多线程的环境中提供了一个简单的处理方式。它有以下几个特性:支持取消。可以安全的更新WPF或windows Forms 控件。在completion event中可以查询异常信息。“在后台”执行耗时任务(例如下载和数据库操作),但不会中断您的应用程序。同时执行多个操作,每个操作完成时都会接到通知。等待资源变得可用,但不会停止(“挂起”)您的应用程序。使用熟悉的事件和委托模型与挂起的异步操作通信。EAP仅仅只是一个模式而已。,所以这些特性必须都由实现者来实现。在Framework中有少数几个类支持这种模式,最著名的就是Background 阅读全文
posted @ 2011-05-25 22:30 LoveJenny 阅读(4696) 评论(9) 推荐(3) 编辑
摘要:1:CountdownEventFramework 4.0提供了一个CountdownEvent类,主要是让你等待多个线程。考虑下这样的场景:有一个任务,3个人去做,你需要等这3个人都做完了才继续下一步操作。下面就是:classThread15{staticCountdownEvent_countdown=newCountdownEvent(3);publicstaticvoidMainThread(){newThread(SaySomething).Start("I'mthread1");newThread(SaySomething).Start("I& 阅读全文
posted @ 2011-05-24 20:28 LoveJenny 阅读(3354) 评论(2) 推荐(2) 编辑
摘要:1:MutexMutex 就像一个C# lock一样,不同的是它可以跨进程.进入和释放一个Mutex要花费几毫秒,大约比C#的lock慢50倍。使用一个Mutex的实例,调用WaitOne方法来获取锁,ReleaseMutex方法来释放锁。因为Mutex是跨进程的,所以我们可以使用Mutex来检测程序是否已经运行。[代码]2:Semaphore:一个Semaphore就像一个酒吧一样,通过门卫来限... 阅读全文
posted @ 2011-05-24 06:26 LoveJenny 阅读(5959) 评论(17) 推荐(14) 编辑
摘要:1: 考虑下下面的代码:classThreadUnsafe{staticint_val1=1,_val2=1;internalstaticvoidGo(){if(_val2!=0){Console.WriteLine(_val1/_val2);}_val2=0;}}这段代码是非线程安全的,假设有两个线程A,B,A,B都执行到了Go方法的if判断中,假设_val2=1.所以两个线程A,B都通过if判断,A执行了Console.WriteLine方法,然后退出if语句,执行_val2=0,此时_val2=0.但是此时线程B才刚刚执行到Console.WriteLine方法,而此时_val2=0.所 阅读全文
posted @ 2011-05-23 06:27 LoveJenny 阅读(5800) 评论(8) 推荐(4) 编辑
摘要:线程池:每一个线程默认会被分配1MB的内存,在C#中,这些都是实打实的分配的,当一个线程启动的时候,为了分配临时堆栈大约需要花费几百微秒的时间。线程池通过循环利用线程可以让你更高效的利用线程。线程池就像外包的劳务队一样,有任务给他们,他们会管理劳务工的一切,你不需要去花时间去找单个劳务工,然后完成任务就解雇她,对劳务队而言,劳务工完成了你的这个任务,还是会回到自己的团队中的,劳务工的管理也不需要你去负责,因为这由劳务队处理了,如果任务太多了,劳务队会自己招一个劳务工,如果还不够就继续招,但是如果任务比较少,而劳务工又比较多的话,对不起,劳务队的管理人员就会解雇一部分劳务工了。有很多方法可以进入 阅读全文
posted @ 2011-05-22 14:06 LoveJenny 阅读(7135) 评论(5) 推荐(8) 编辑
摘要:1:你可以调用线程的实例方法Join来等待一个线程的结束。例如: publicstaticvoidMainThread(){Threadt=newThread(Go);t.Start();t.Join();Console.WriteLine("Threadthasended!");}staticvoidGo(){for(inti=0;i<1000;i++)Console.Write("y");}在打印了1000个Y之后,后面就会输出”Thread t has ended!”.,你可以在调用Join方法的时候给它一个timeout的参数,例如要超时一 阅读全文
posted @ 2011-05-21 17:11 LoveJenny 阅读(5901) 评论(8) 推荐(13) 编辑
摘要:CLR和操作系统会自动的为应用程序创建一个线程,这个线程叫做主线程(main Thread)如果要创建一个新的线程,可以使用Thread类。下面是一个简单的例子:[代码]for(inti=0;i1000;i++)Console.Write("x");}staticvoidWriteY(){for(inti=0;i1000;i++)Console.Write("y");}}首先创建了一个线程来执... 阅读全文
posted @ 2011-05-21 07:10 LoveJenny 阅读(7687) 评论(19) 推荐(17) 编辑
摘要:跨线程有两种方法。1:this.Dispatcher.BeginInvoke2:SynchronizationContext 在上篇文章中我使用了第一种方法。显然每次都要调用this.Dispatcher.BeginInvoke是一件很“环照”的事情。为了完善RestInvoke,我打算使用SynchronizationContext类,而SynchronizationContext类要和WebRequest关联。为什么要和WebRequest关联呢?因为一个Request对应了一个线程上下文,所以要保存请求时候的线程上下文,然后在成功获取数据后再调用保存的线程上下文来跨线程操作。 首先想到的 阅读全文
posted @ 2011-05-16 19:49 LoveJenny 阅读(2120) 评论(11) 推荐(2) 编辑
摘要:在上篇文章中我们封装了Rest请求,下面我将做一些demo给大家演示RestInvoker怎么使用。首先是服务契约代码:这里注意下CreateByIdAndName方法,因为有两个参数,所以bodyStyle选择wrappedRequest.也就是对Request进行Wrapped的意思。Wrapped的效果就是Json的格式会不一致。View Code [ServiceContract][ServiceKnownType(typeof(Product))]publicinterfaceIRestService{[OperationContract][WebGet(UriTemplate=&q 阅读全文
posted @ 2011-05-15 21:22 LoveJenny 阅读(2244) 评论(2) 推荐(2) 编辑
摘要:今天打开google首页,页面如下:其中动画过程很漂亮,为了方便我录下了视频:Google_Logo.rar看看整个动画过程,还是很优美的,而且动画也比较顺滑,猜想是gif图像,毕竟在网页上像这种动画用gif来做的还是比较多的。右键查看源文件,查找gif,没有发现文件,找到了:http://www.google.com.hk/logos/2011/graham11-hp-start.png和http://www.google.com.hk/logos/2011/graham11-hp-sprite.png。猜测动画效果可能是由多幅图片叠加而形成的,这么猜想的原因很简单,因为google地图就是 阅读全文
posted @ 2011-05-11 22:57 LoveJenny 阅读(3685) 评论(9) 推荐(1) 编辑
摘要:还记得上篇文章中的PUT调用Rest服务的代码吗?不记得没关系,下面就是它的代码。View Code #region使用WebRequestWebRequestwebRequest=WebRequestCreator.ClientHttp.Create(newUri("http://localhost:19598/ProductService.svc/Product"));webRequest.ContentType="application/json";webRequest.Method="PUT";webRequest.Begin 阅读全文
posted @ 2011-05-11 20:18 LoveJenny 阅读(2935) 评论(2) 推荐(4) 编辑
摘要:我们在上篇文章中讲过WebClient不支持PUT,DELETE.那么WebRequest支持PUT和DELETE吗??于是我们修改PUT代码为:WebRequestwebRequest=WebRequest.Create("http://localhost:19598/ProductService.svc/Product");webRequest.ContentType="application/json";webRequest.Method="PUT";结果还是一样的错误,细心的读者如果反编译过WebClient的话,可以看到内部 阅读全文
posted @ 2011-05-09 20:58 LoveJenny 阅读(4605) 评论(3) 推荐(4) 编辑

EasyText, EasyLicense 的作者, https://github.com/EasyHelper Good Good Study,Day Day Up.

 

点击右上角即可分享
微信分享提示