基元用户模式构造--互锁构造 Interlocked 实现的异步web请求实例
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net.Http;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace Test
- {
- enum CoordinationStatus
- {
- AllDone,
- Cancel,
- Timeout
- }
- class AsyncCoordinator
- {
- private int statusReported = ;
- private int op_count = ;
- private Action<CoordinationStatus> callback;
- private Timer timer;
- public void AboutToBegin(int num = )
- {
- Interlocked.Add(ref op_count, num);
- }
- public void JustToEnd()
- {
- if (Interlocked.Decrement(ref op_count) == )
- {
- ReportStatus(CoordinationStatus.AllDone);
- }
- }
- public void AllBegun(Action<CoordinationStatus> callback, int timeout = Timeout.Infinite)
- {
- this.callback = callback;
- if (timeout != Timeout.Infinite)
- {
- timer = new Timer(Expired, null, timeout, Timeout.Infinite);
- }
- JustToEnd();
- }
- private void Expired(object obj)
- {
- ReportStatus(CoordinationStatus.Cancel);
- }
- public void Cancel()
- {
- ReportStatus(CoordinationStatus.Cancel);
- }
- private void ReportStatus(CoordinationStatus status)
- {
- if (Interlocked.Exchange(ref statusReported, ) == )
- {
- callback(status);
- }
- }
- }
- class MultiWebRequests
- {
- private AsyncCoordinator coordinator = new AsyncCoordinator();
- private Dictionary<string, object> servers = new Dictionary<string, object>(){
- {"http://www.baidu.com",null},
- {"http://www.sina.com",null},
- {"http://www.qq.com",null},
- };
- public MultiWebRequests()
- {
- var http = new HttpClient();
- foreach (var url in servers.Keys)
- {
- //发送了一个请求
- coordinator.AboutToBegin();
- http.GetByteArrayAsync(url).ContinueWith(task => GetResult(url, task));
- }
- //所有请求发送完毕
- coordinator.AllBegun(AllDone, Timeout.Infinite);
- }
- private void GetResult(string server, Task<byte[]> task)
- {
- object res;
- if (task.Exception != null)
- {
- res = task.Exception.InnerExceptions;
- }
- else
- {
- res = task.Result.Length;
- }
- servers[server] = res;
- //完成了一个请求
- coordinator.JustToEnd();
- }
- public void Cancel()
- {
- coordinator.Cancel();
- }
- private void AllDone(CoordinationStatus status)
- {
- switch (status)
- {
- case CoordinationStatus.AllDone:
- Console.WriteLine("allDone: ");
- foreach (var item in servers)
- {
- Console.Write(item.Key);
- object val = item.Value;
- if (val is Exception)
- {
- Console.WriteLine("Exception: {0}",val.GetType().Name);
- }
- else
- {
- Console.WriteLine("returned {0:N0} bytes",val);
- }
- }
- break;
- case CoordinationStatus.Cancel:
- break;
- case CoordinationStatus.Timeout:
- break;
- default:
- break;
- }
- }
- }
- }
基元用户模式构造--互锁构造 Interlocked 实现的异步web请求实例的更多相关文章
- C#多线程编程(6)--线程安全2 互锁构造Interlocked
在线程安全1中,我介绍了线程同步的意义和一种实现线程同步的方法:volatile.volatile关键字属于原子操作的一种,若对一个关键字使用volatile,很多时候会显得很"浪费&quo ...
- 【C#】C#线程_基元线程的同步构造
目录结构: contents structure [+] 简介 为什么需要使用线程同步 线程同步的缺点 基元线程同步 什么是基元线程 基元用户模式构造和内核模式构造的比较 用户模式构造 易变构造(Vo ...
- 【C#进阶系列】28 基元线程同步构造
多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...
- Clr Via C#读书笔记----基元线程同步构造
线程文章:http://www.cnblogs.com/edisonchou/p/4848131.html 重点在于多个线程同时访问,保持线程的同步. 线程同步的问题: 1,线程同步比较繁琐,而且容易 ...
- C#异步编程(二)用户模式线程同步
基元线程同步构造 多个线程同时访问共享数据时,线程同步能防止数据损坏.不需要线程同步是最理想的情况,因为线程同步存在许多问题. 第一个问题就是它比较繁琐,而且很容易写错. 第二个问题是,他们会损害性能 ...
- [.net]基元线程同步构造
/* 基元线程同步构造 用户模式构造: 易变构造(Volatile Construct) 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimisti ...
- CLR via C# I/O基元线程同步构造
1. 分为用户模式构造和内核模式构造 2. 用户模式构造 a.易失构造 在一个简单数据类型的变量上执行原子性读或写操作 VolaileWrite 强制address中的值在调用时写入,除此之外,按照源 ...
- .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
本随笔续接:.NET 同步与异步之锁(ReaderWriterLockSlim)(八) 之前的随笔已经说过.加锁虽然能很好的解决竞争条件,但也带来了负面影响:性能方面的负面影响.那有没有更好的解决方案 ...
- 基元线程同步构造之 Mutes(互斥体)
互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)). 互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section). 因 ...
随机推荐
- springboot 入门
使用maven构建project项目, 配置aliyun仓库, 不赘述 springboot 版本需要: jdk1.7+, maven3.2+ , gradle2.9+ 配置文件 引入父包, 放在&l ...
- postgresql逻辑结构--表(二)
一.创建表 语法: create table table_name( col01_name data_type, col02_name data_type, col03_name data_type, ...
- IDA动态调试so文件出现SIGILL
用ida6.6 调试android的so文件时经常会报SIGILL的错误,意思是指令非法.而且这种错误基本都是发生在系统函数内部,像我遇到过的mmap,fopen,fgets等等.在这些函数内部如果用 ...
- git remote: HTTP Basic: Access denied 错误解决办法
问题描述: git push 报 HTTP Basic: Access denied 错误 原因:本地git配置的用户名.密码与gitlabs上注册的用户名.密码不一致. 解决方案: 1. 如果账号密 ...
- 浅析libuv源码-获取精确时间
在Timer模块中有提到,libuv控制着延迟事件的触发,那么必须想办法精确控制时间. 如果是JS,获取当前时间可以直接通过Date.now()得到一个时间戳,然后将两段时间戳相减得到时间差.一般情况 ...
- 用Collectors对List去重
在学习本篇之前,最好对java8新特性有一定的了解.可以参考:Java8新特性--流(Stream) 场景:有一个实体的List集合,需要根据实体中的某个字段对List去重 要想去重,可以考虑使用Tr ...
- .net开源项目整理
整理一些平时收藏和应用的开源代码,方便自己学习和查阅 1.应用 nopcommerce,开源电商网站,开发环境asp.net mvc(未支持.net core),使用技术(autofac,ef,页面插 ...
- Visual studio 2017 Installer 打包.netframework
前几步和网上其他教程一样的.主要是把.net framework 打包进安装程序里,如果选的是“从与我的应用程序相同的位置下载系统必备组件”,会提示 ERROR: 要在“系统必备”对话框中启用“从与我 ...
- Java基础——collection接口
一.Collection接口的定义 public interfaceCollection<E>extends iterable<E> 从接口的定义中可以发现,此接口使用了泛型 ...
- @ContextConfiguration的意思
@ContextConfiguration的意思 @ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试 ...