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. TCP保活的必要性

    TCP的长连接理论上只要连接建立后,就会一直保持着.但有时有一些防火墙之类的软件会自动检查主机的网络连接状况,比如说如果发现某个连接在几分钟之内都没有数据通讯,则会关闭这个连接.有时客户端与服务器需要 ...

  2. PTA (Advanced Level) 1006 Sign In and Sign Out

    Sign In and Sign Out At the beginning of every day, the first person who signs in the computer room ...

  3. PTA (Advanced Level) 1005 Spell It Right

    Spell It Right Given a non-negative integer N, your task is to compute the sum of all the digits of  ...

  4. 【Leetcode】338. Bit位计数

    每次刷leetcode都有一种发现新大陆的感觉. 题目链接:https://leetcode-cn.com/problems/counting-bits/description/ 给定一个非负整数 n ...

  5. Core Animation之CABasicAnimation(基础动画)

    #import "ViewController.h" @interface ViewController () @property(nonatomic,strong)UIButto ...

  6. 使用WireShark分析使用RedisTemplate取不到值的问题

    现象:使用Java Redis客户端将数据存放到Redis后,使用redisTemplate却不出来原因:Java Redis客户端在将数据存放在Redis时,会对Key,Value,Field进行编 ...

  7. 深入出不来nodejs源码-timer模块(C++篇)

    终于可以填上坑了. 简单回顾一下之前JS篇内容,每一次setTimeout的调用,会在一个对象中添加一个键值对,键为延迟时间,值为一个链表,将所有该时间对应的事件串起来,图如下: 而每一个延迟键值对的 ...

  8. 将ABP的数据库从SQLSERVER迁移到MySql

    摘要:之前跟着网上的一些教程,学习了一点ABP的知识.最近想说把默认的SQLSERVER数据迁移到mysql吧 首先网上搜一波 安装MySql.Data.Entity 然后你需要安装 MySql.Da ...

  9. 【原】Solr入门之概念和安装

    Apache Solr 是Apache Lucene项目的开源企业搜索平台.其主要功能包括全文检索.命中标示.分面搜索.动态聚类.数据库集成,以及富文本(如Word.PDF)的处理.Solr是高度可扩 ...

  10. git使用基本教程

    黑马的视频,以前看过廖雪峰的git,总是学不懂,这次终于看会了,结合视频更佳,红色字是重点. 基于linux下面git百度云视频教程:http://pan.baidu.com/s/1bpk472B 密 ...