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请求实例的更多相关文章

  1. C#多线程编程(6)--线程安全2 互锁构造Interlocked

    在线程安全1中,我介绍了线程同步的意义和一种实现线程同步的方法:volatile.volatile关键字属于原子操作的一种,若对一个关键字使用volatile,很多时候会显得很"浪费&quo ...

  2. 【C#】C#线程_基元线程的同步构造

    目录结构: contents structure [+] 简介 为什么需要使用线程同步 线程同步的缺点 基元线程同步 什么是基元线程 基元用户模式构造和内核模式构造的比较 用户模式构造 易变构造(Vo ...

  3. 【C#进阶系列】28 基元线程同步构造

    多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...

  4. Clr Via C#读书笔记----基元线程同步构造

    线程文章:http://www.cnblogs.com/edisonchou/p/4848131.html 重点在于多个线程同时访问,保持线程的同步. 线程同步的问题: 1,线程同步比较繁琐,而且容易 ...

  5. C#异步编程(二)用户模式线程同步

    基元线程同步构造 多个线程同时访问共享数据时,线程同步能防止数据损坏.不需要线程同步是最理想的情况,因为线程同步存在许多问题. 第一个问题就是它比较繁琐,而且很容易写错. 第二个问题是,他们会损害性能 ...

  6. [.net]基元线程同步构造

    /* 基元线程同步构造 用户模式构造: 易变构造(Volatile Construct) 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimisti ...

  7. CLR via C# I/O基元线程同步构造

    1. 分为用户模式构造和内核模式构造 2. 用户模式构造 a.易失构造 在一个简单数据类型的变量上执行原子性读或写操作 VolaileWrite 强制address中的值在调用时写入,除此之外,按照源 ...

  8. .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)

    本随笔续接:.NET 同步与异步之锁(ReaderWriterLockSlim)(八) 之前的随笔已经说过.加锁虽然能很好的解决竞争条件,但也带来了负面影响:性能方面的负面影响.那有没有更好的解决方案 ...

  9. 基元线程同步构造之 Mutes(互斥体)

    互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)). 互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section). 因 ...

随机推荐

  1. 简单的字母全排列问题—递归法和STL法

    问题描述:求全由小写字母组成的不超过200个字符序列的全排列 如输入序列bbjd,排列结果为: bbdj bbjd bdbj bdjb bjbd bjdb dbbj dbjb djbb jbbd jb ...

  2. gitlab的md文件内使用锚点

    markdown中使用锚点的格式: [要显示的内容](#锚点的链接) 如: [工具](#tool) 又因为再markdown中每一个标题都默认是锚点,所以事情就简单了 # test ## conten ...

  3. linux编译找不到aprt apr-util

    Linux很多地方编译的时候都会用到apr 如果找不到apr就会报错 configure: WARNING: APR not found The Apache Portable Runtime (AP ...

  4. 第七章 过滤器 Filter(二)

    一  过滤器API 由容器实现的接口 –javax.servlet.Filter –javax.servlet.FilterChain –javax.servlet.FilterConfig 四个包装 ...

  5. CRM项目hellokitty部分交互界面

    登录界面 实现密码的不显示,验证码的跟换 员工管理界面  完成所有的功能 学校统计界面 完成所有的功能 班级管理 差一个手风琴组件 其他功能也完成了

  6. C# 如何判断ie版本号和获取注册表中的信息

    1.获取ie版本号 string ver = (new WebBrowser()).Version.ToString(); 例如:11.0.10586.103 int mainVer = (new W ...

  7. .NET Core类库中读取配置文件

    最近在开发基于.NET Core的NuGet包,遇到一个问题:.NET Core中已经没有ConfigurationManager类,在类库中无法像.NET Framework那样读取App.conf ...

  8. Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)(转载)

    Sql 四大排名函数(ROW_NUMBER.RANK.DENSE_RANK.NTILE)简介   排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张O ...

  9. java的锁机制——synchronized

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...

  10. Java基础——JSP(三)

    一. JavaBean 是一种特殊的java类,它遵从一定的设计模式,开发工具和其他组件可以根据这种模式来调用javaBean.它是使用一种符合某些命名方法和设计规范的java类. -- 这个类是可序 ...