摘要: 使用ConcurrentBag创建一个可扩展的爬虫,本示例在多个独立的即可生产任务又可消费任务的工作者间如何扩展工作量。本示例模拟一个爬虫程序。阅读全文
posted @ 2018-01-16 17:23 DotNet菜园 阅读(23) 评论(0) 编辑
摘要: 本示例将学习如何创建一个能被多个线程异步处理的一组任务的例子。阅读全文
posted @ 2018-01-08 14:26 DotNet菜园 阅读(456) 评论(1) 编辑
摘要: 并行算法有可能非常复杂,并且或多或少涵盖了这些并行集合。线程安全并不是没有代价的。比起System.Collections和System.Collections.Generic命名空间中的经典列表 、集合和数组来说,并发集合会有更大的开销,因此,应该只在需要从多个任务中并发访问集合的时候才使用并发集合。在中等代码中使用并发集合没有意义,因为它们会增加无谓的开销。阅读全文
posted @ 2018-01-02 16:29 DotNet菜园 阅读(601) 评论(1) 编辑
摘要: 本示例学习使用await来获取异步操作结果时,同步上下文行为的结节,并如何在何时关闭同步上下文流。 默认情况下,await操作符会尝试捕获同步上下文,并在其中执行代码。使用await操作符不会发生死锁的情况,因为当等待结果时并不会阻塞UI线程。阅读全文
posted @ 2017-12-27 10:16 DotNet菜园 阅读(615) 评论(1) 编辑
摘要: 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步调用 。阅读全文
posted @ 2017-12-21 14:49 DotNet菜园 阅读(749) 评论(1) 编辑
摘要: 通过前面的文章,已经学习了怎么使用线程,怎么使用线程同步,怎么使用线程池,怎么使用任务并行库。尽管通过上面的学习,对于线程的使用越来越简单。有没有更简单的方法呢。 C# 5.0之后,微软在c#语言中添加了两个关键字async与await,这是在TPL上面的更高一级的抽象,真正简化了异步编程的编程方式,从而有助于我们编写出真正健壮少bug的异步应用程序。阅读全文
posted @ 2017-12-18 15:38 DotNet菜园 阅读(1211) 评论(1) 编辑
摘要: 我们学习任务调度程序,通过异步代码与UI进行交互。所以本示例是创建Windows应用程序。 taskScheduler是负责如何执行任务,默认情况下是把task放入线程池中的工作线程中。阅读全文
posted @ 2017-12-11 16:07 DotNet菜园 阅读(607) 评论(1) 编辑
摘要: 本示例学习如何实现基于Task的异步操作进行取消流程,以及在任务真正运行前如何知道任务已经被取消。 我们学习如何在task中抛出不同情况的异常,以及如何获取这些异常信息。阅读全文
posted @ 2017-12-06 16:39 DotNet菜园 阅读(577) 评论(1) 编辑
摘要: 本示例,将上一篇(多线程编程学习笔记——线程池(三))中的(使用BackgroundWorker组件示例)转为任务。 本示例是学习如何基于事件的异步转换为TASK来运行。本示例的关键是使用TaskCompletionSource阅读全文
posted @ 2017-12-01 13:59 DotNet菜园 阅读(560) 评论(0) 编辑
摘要: 在net framework 4.0中微软又提供了一个新的异步操作的功能,叫做任务并行库(TPL)。任务并行库的核心是任务(task)。一个任务代表了一个异步操作,譔操作可以通过多种方式运行,可以使用或不使用独立的线程。 一个任务(Task)可以通过多种方式和其他任务组合起来使用。例如,可以同时开启多个任务,等待所有任务完成,再起一个任务进行操作。一个任务可以有多个其他任务组成,这些任务也可以依次拥有自己的子任务。阅读全文
posted @ 2017-11-24 16:21 DotNet菜园 阅读(1176) 评论(2) 编辑
摘要: 本示例主要学习如果对线程池中的操作实现超时,并在线程池中正确等待。 线程池还有一个ThreadPool.RegisterWaitForSingleObject,这个方法允许我们将回调函数放入线程池中的队列中。当提供的等待事件处理器接收到信号或发生超时时,这个回调函数将被调用,这样就实现了为线程池中操作实现超时操作。阅读全文
posted @ 2017-11-20 09:30 DotNet菜园 阅读(886) 评论(2) 编辑
摘要: 如果我们要从线程池中取消某个线程的操作,应该如何实现呢?本示例使用CancellationTokenSource和CancellationToken两个类来实现在取消线程池中的操作。阅读全文
posted @ 2017-11-13 09:45 DotNet菜园 阅读(423) 评论(2) 编辑
摘要: .NET中的线程池是受CLR管理的,TheadTool类有一个QueueUserWorkItem静态方法,这个静态方法接受一个委托,代表用户自定义的一个异步操作,在这个方法被调用之后,委托会进入到内部队列中,如果池中没有线程,则创建一个工作线程,把第一个委托放入工作线程。如果继续放入委托,则池创建新的工作线程,直到工作线程数量达到上限。这时再放入委托,则不会创建新的工作线程,而是在队列中等待,直到有空闲的工作线程。阅读全文
posted @ 2017-11-08 12:05 DotNet菜园 阅读(1248) 评论(2) 编辑
摘要: Barrier类用于组织多个线程及时在某个时刻会面,其提供一个回调函数,每次线程调用了SignalAndWait方法后该回调函数就会被执行。阅读全文
posted @ 2017-11-03 15:29 DotNet菜园 阅读(670) 评论(0) 编辑
摘要: 程序中,我们定义了两个AutoResetEvent实例。其中一个是从子线程往主线程发信号 ,另一个是主线程往子线程发信号。我们在构造AutoResetEvent时,传入了false,定义了这两个实例的初始状态unsignaled。这个状态下,任何线程调用这两个实例的WaitOne方法将会被阻塞,直到我们调用了Set方法。如果我们在构造的时候传入了true,则这两个实例的初始状态是singnaled,则线程调用WaitOne则会被立即处理。阅读全文
posted @ 2017-11-01 15:08 DotNet菜园 阅读(689) 评论(0) 编辑
摘要: 多线程使用共享变量,就会涉及到一个线程同步的问题。那如何解决呢? 1) 重构程序,移除多线程的共享变量,让一个线程只访问一个自有变量 2) 使用原子操作,一个操作只占用一个量子时间,一次完成,只有当当前操作完成之后,其他线程才能进行操作。这样可以避免使用独占锁,避免死锁。 3) 通过NET构架提供的Mutex、AutoRestEvent、CountDownEven、SpinWait等类,来进行线程间的同步。阅读全文
posted @ 2017-10-27 16:21 DotNet菜园 阅读(1309) 评论(2) 编辑
摘要: 多线程编程学习笔记-基础阅读全文
posted @ 2017-10-25 14:15 DotNet菜园 阅读(671) 评论(1) 编辑
摘要: 多线程编程学习笔记阅读全文
posted @ 2017-10-20 13:35 DotNet菜园 阅读(904) 评论(1) 编辑
摘要: 多线程编程学习笔记阅读全文
posted @ 2017-10-19 16:04 DotNet菜园 阅读(1386) 评论(4) 编辑
摘要: 最近在学习百度的开源上传组件WebUploader,上一篇文章,学习了批量文件上传,今天学习一下批量图片上传,实际上与文件上传很类似,只是添加了图片显示功能,这个功能WebUploader组件中已经提供了。阅读全文
posted @ 2017-09-07 16:41 DotNet菜园 阅读(586) 评论(0) 编辑