摘要:
Event-based asynchronous(EAP)在多线程的环境中提供了一个简单的处理方式。它有以下几个特性:支持取消。可以安全的更新WPF或windows Forms 控件。在completion event中可以查询异常信息。“在后台”执行耗时任务(例如下载和数据库操作),但不会中断您的应用程序。同时执行多个操作,每个操作完成时都会接到通知。等待资源变得可用,但不会停止(“挂起”)您的应用程序。使用熟悉的事件和委托模型与挂起的异步操作通信。EAP仅仅只是一个模式而已。,所以这些特性必须都由实现者来实现。在Framework中有少数几个类支持这种模式,最著名的就是Background 阅读全文
摘要:
1:CountdownEventFramework 4.0提供了一个CountdownEvent类,主要是让你等待多个线程。考虑下这样的场景:有一个任务,3个人去做,你需要等这3个人都做完了才继续下一步操作。下面就是:classThread15{staticCountdownEvent_countdown=newCountdownEvent(3);publicstaticvoidMainThread(){newThread(SaySomething).Start("I'mthread1");newThread(SaySomething).Start("I& 阅读全文
摘要:
1:MutexMutex 就像一个C# lock一样,不同的是它可以跨进程.进入和释放一个Mutex要花费几毫秒,大约比C#的lock慢50倍。使用一个Mutex的实例,调用WaitOne方法来获取锁,ReleaseMutex方法来释放锁。因为Mutex是跨进程的,所以我们可以使用Mutex来检测程序是否已经运行。[代码]2:Semaphore:一个Semaphore就像一个酒吧一样,通过门卫来限... 阅读全文
摘要:
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.所 阅读全文
摘要:
线程池:每一个线程默认会被分配1MB的内存,在C#中,这些都是实打实的分配的,当一个线程启动的时候,为了分配临时堆栈大约需要花费几百微秒的时间。线程池通过循环利用线程可以让你更高效的利用线程。线程池就像外包的劳务队一样,有任务给他们,他们会管理劳务工的一切,你不需要去花时间去找单个劳务工,然后完成任务就解雇她,对劳务队而言,劳务工完成了你的这个任务,还是会回到自己的团队中的,劳务工的管理也不需要你去负责,因为这由劳务队处理了,如果任务太多了,劳务队会自己招一个劳务工,如果还不够就继续招,但是如果任务比较少,而劳务工又比较多的话,对不起,劳务队的管理人员就会解雇一部分劳务工了。有很多方法可以进入 阅读全文
摘要:
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的参数,例如要超时一 阅读全文
摘要:
CLR和操作系统会自动的为应用程序创建一个线程,这个线程叫做主线程(main Thread)如果要创建一个新的线程,可以使用Thread类。下面是一个简单的例子:[代码]for(inti=0;i1000;i++)Console.Write("x");}staticvoidWriteY(){for(inti=0;i1000;i++)Console.Write("y");}}首先创建了一个线程来执... 阅读全文
摘要:
跨线程有两种方法。1:this.Dispatcher.BeginInvoke2:SynchronizationContext 在上篇文章中我使用了第一种方法。显然每次都要调用this.Dispatcher.BeginInvoke是一件很“环照”的事情。为了完善RestInvoke,我打算使用SynchronizationContext类,而SynchronizationContext类要和WebRequest关联。为什么要和WebRequest关联呢?因为一个Request对应了一个线程上下文,所以要保存请求时候的线程上下文,然后在成功获取数据后再调用保存的线程上下文来跨线程操作。 首先想到的 阅读全文
摘要:
在上篇文章中我们封装了Rest请求,下面我将做一些demo给大家演示RestInvoker怎么使用。首先是服务契约代码:这里注意下CreateByIdAndName方法,因为有两个参数,所以bodyStyle选择wrappedRequest.也就是对Request进行Wrapped的意思。Wrapped的效果就是Json的格式会不一致。View Code [ServiceContract][ServiceKnownType(typeof(Product))]publicinterfaceIRestService{[OperationContract][WebGet(UriTemplate=&q 阅读全文
摘要:
今天打开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地图就是 阅读全文