,
C#异步编程 https://msdn.microsoft.com/zh-cn/magazine/ff959203.aspx
异步做耗时操作:计算,通信(下载,上传等),磁盘读写等。
①:微软的API 在一个类中的方法一般以 xxxCompleted 为模板的方法,是一个delegate,需要 += method 操作的,一般异步完成之后回调这个方法,这样的模式称之为基于事件的模式。
②:SynchronizationContext ctx = SynchronizationContext.Current;一个线程一个SynchronizationContext 里面有send/post方法,可以在异步线程方法中调用send/post回调到SynchronizationContext 所在的线程执行。如果是基于多线程并发执行之后,需要对结果做排序处理,则要对send/post进行重写,在里面对结果重新排序,将事件封装在集合里面,在外部一直调用集合里面的事件,调用之后则移除事件,使用ConcurrentQueue安全队列最好。
③:IAsyncResult模式,Begin开始异步,End结束异步并回调。一般是在Begin方法中传入异步工作完成之后调用的一个方法,这个方法还是在异步线程中。
④:任务模式 System.Threading.Tasks.Task
Wait方法表示在当前的代码块中,指定的Task任务不完成,不会执行下面的代码。即同步阻塞。
ThreadPool 线程池 http://www.cnblogs.com/kissdodog/archive/2013/03/28/2986026.html
TaskCompletionSource 是创建表示异步操作的 Task 的常规机制。 TaskCompletionSource 只与一项任务相关联。 一旦对 TaskCompletionSource 调用 SetResult 方法,相关联的 Task 便会结束,返回 Task 的结果值。
基于事件,基于IAsyncResult模式都可以直接转换为Task线程模式
处理和组合任务 :
A:等待 Task 任务完成 Task.WaitAny(...) ,Task.WaitAll(tasks) 静态方法调用 task1.Wait()实例对象调用。
B:Task 任务完之后,再接一个Task 任务。
网友评论