异步等待(ManualResetEvent
ManualResetEvent实现异步等待,超过时间 不做处理,继续往下执行代码
(ManualResetEvent 涉及一个线程在其他线程进行之前必须完成的任务)
ManualResetEvent[] mre = new ManualResetEvent[];
mre[] = new ManualResetEvent(false);
shoppingbll spb = new shoppingbll(mre[], dict);
Thread thd1 = new Thread(new ThreadStart(spb.GetGPrice));
thd1.Start();
mre[] = new ManualResetEvent(false);
farebll pfb = new farebll(mre[], dict);
Thread thd2 = new Thread(new ThreadStart(pfb.GetfarePrice));
thd2.Start();
//停顿12s 超过12s后,执行后面代码,不再等待
WaitHandle.WaitAll(mre, , false);
GetGPrice 方法(GetfarePrice类似) ,调用ManualResetEvent 的set()方法 返回信号;
public void GetGPrice()
{
try
{
//todo
}
catch (Exception e)
{ }
finally
{
if (_mre != null)
{
_mre.Set();//返回完成信号
}
}
}
Task(任务)类似用法:
Task t1 = new Task(func);//无返回值
Task<int> t2 = new Task<int>(()=>canshufun());//有返回值(带参数
Task<int> t3 = new Task<int>(() => intfun());//有返回值(无参数 Task[] tt = new Task[] { t1, t2 ,t3};
Task.WaitAll(tt, * );//10秒后 不再等待,往后执行
int result2 = t2.Result;//获取返回结果
int result3 = t3.Result;//获取返回结果 public void func()
{ } public int intfun()
{
return ;
}
public int canshufun(int i)
{
return i;
}
Task 通过CancellationTokenSource参数 取消超时线程任务
/// <summary>
/// 返回政策
/// </summary>
/// <param name="dept">出发</param>
/// <param name="arr">到达</param>
/// <param name="depttime">出发日期</param>
/// <param name="arrtime">返程日期</param>
/// <param name="from">政策源</param>
/// <param name="carriers">航司</param>
/// <param name="cabinlevels">舱位等级(First, Business, Economy)</param>
/// <param name="ftype">1,直飞;2,所有</param>
/// <param name="number">返回数量</param>
/// <param name="second">超时时间</param>
/// <param name="iresponsetime">国际接口返回时间</param>
/// <param name="nresponsetime">国内接口返回时间</param>
/// <returns></returns>
public model.PolicyCacheModel Get(string dept, string arr, string depttime, string arrtime, string from, string carriers, string cabinlevels, string ftype, int number, int second, ref int iresponsetime, ref int nresponsetime)
{
List<string> policies = from.Split('|').ToList();
List<string> gj = new List<string>();
List<string> gn = new List<string>();
foreach (string s in policies)
{
if(s.Contains("12,")) gj.Add(s);
else if (s.Contains("18,")) gj.Add(s);
else if (s.Contains("20,")) gn.Add(s);
else if (s.Contains("50,")) gj.Add(s);
else gn.Add(s);
} if (gj.Count == && gn.Count == ) return null; Task<model.CompareModel> gjtask = null;
Task<model.CompareModel> gntask = null;
CancellationTokenSource gjct = null;
CancellationTokenSource gnct = null;
List<Task<model.CompareModel>> tasks = new List<Task<model.CompareModel>>(); if (gj.Count > )
{
gjct = new CancellationTokenSource();
gjtask = new Task<model.CompareModel>(() => GetInternational(dept, arr, depttime, arrtime, from, carriers, cabinlevels, ftype, number, second), gjct.Token);
tasks.Add(gjtask);
}
if (gn.Count > )
{
gnct = new CancellationTokenSource();
gntask = new Task<model.CompareModel>(() => GetNational(dept, arr, depttime, arrtime, from, carriers, cabinlevels, ftype, number, second), gnct.Token);
tasks.Add(gntask);
} if (gjtask != null) gjtask.Start();
if (gntask != null) gntask.Start();
Task.WaitAll(tasks.ToArray(), second * ); model.CompareModel m1 = null;
model.CompareModel m2 = null;
if (gjtask != null)
{
if (gjtask.Status == TaskStatus.RanToCompletion) m1 = gjtask.Result;
else gjct.Cancel();
}
if (gntask != null)
{
if (gntask.Status == TaskStatus.RanToCompletion) m2 = gntask.Result;
else gnct.Cancel();
} try
{
model.CompareModel d = InMatch(m1, m2);
model.PolicyCacheModel m3 = MatchRebate(d);
return m3;
}
catch (Exception ex)
{
return null;
}
}
参考:
http://www.cnblogs.com/li-peng/p/3291306.html
http://www.cnblogs.com/springyangwc/archive/2011/10/12/2208991.html
异步等待(ManualResetEvent的更多相关文章
- Socket层实现系列 — 信号驱动的异步等待
主要内容:Socket的异步通知机制. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件.有数据可读事 ...
- .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试.然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误. 这似乎是一个矛盾的要求.然而最终我想到了一个办法:让重试一直进 ...
- .NET 中什么样的类是可使用 await 异步等待的?
我们已经知道 Task 是可等待的,但是去看看 Task 类的实现,几乎找不到哪个基类.接口或者方法属性能够告诉我们与 await 相关. 而本文将探索什么样的类是可使用 await 异步等待的? D ...
- .NET 中让 Task 支持带超时的异步等待
Task 自带有很多等待任务完成的方法,有的是实例方法,有的是静态方法.有的阻塞,有的不阻塞.不过带超时的方法只有一个,但它是阻塞的. 本文将介绍一个非阻塞的带超时的等待方法. Task 已有的等 ...
- 如何实现一个可以用 await 异步等待的 Awaiter
.NET 和 C# 共同给我们带来的 async/await 异步编程模型(TAP)用起来真的很爽.为了实现异步等待,我们只需要在一切能够能够异步等待的方法前面加上 await 即可.能够异步等待的最 ...
- 实现一个可以用 await 异步等待的 Awaiter
总结起来,要想使一个方法可被 await 等待,必须具备以下条件: 这个方法返回一个类 A 的实例,这个类 A 必须满足后面的条件.此类 A 有一个可被访问到的 GetAwaiter 方法(扩展方法也 ...
- [译]理解Javascript的异步等待
原文链接: https://ponyfoo.com/articles/understanding-javascript-async-await 作者: Nicolás Bevacqua 目前async ...
- 理解Javascript的异步等待
目前async / await特性并没有被添加到ES2016标准中,但不代表这些特性将来不会被加入到Javascript中.在我写这篇文章时,它已经到达第三版草案,并且正迅速的发展中.这些特性已经被I ...
- 异步等待的 Python 协程
现在 Python 已经支持用协程进行异步处理.但最近有建议称添加协程以全面完善 Python 的语言结构,而不是像现在这样把他们作为生成器的一个类型.此外,两个新的关键字---异步(async)和等 ...
随机推荐
- Security » Authorization » 基于自定义策略的授权
Custom Policy-Based Authorization¶ 基于自定义策略的授权 98 of 108 people found this helpful Underneath the cov ...
- 关于如何来构造一个String类
今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现..... 内容写的过于简单,没有涉及到其 ...
- cmake gcc等安装备案
cmake安装,参照 http://www.cnblogs.com/voyagflyer/p/5323748.html cmake2.8以上 安装后的是/usr/local/bin/cmake -ve ...
- C#微信开发-微信JS-SDK(1)之通过config接口注入权限验证配置
官方文档是微信JS-SDK的使用步骤http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#JSSDK.E4.BD.B ...
- .htaccess简介和详解
.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到 ...
- 苹果IOS系统SVN命令 同样适用于linux系统
1.将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn checkout svn://192.168.1.1/pro/domain简写:svn ...
- CSS样式选择器优先级
CSS样式选择器分为4个等级,a.b.c.d,可以以这四种等级为依据确定CSS选择器的优先级. 1.如果样式是行内样式(通过Style=””定义),那么a=12.b为ID选择器的总数3.c为Class ...
- Fedora10下建立linux系统的窗口没有地址栏
Fedora10下建立的linux系统窗口没有地址栏 打开一个文件夹就打开一个窗口,还没有地址栏,这很麻烦也不习惯. 另:打开地址栏可以用组合键 Ctrl+L 如图 解决: edit---perfer ...
- JavaScript 数组的创建
数组定义:数组(array)是一种数据类型,它包含或者存储了编码的值,每个编码的值称作该数组的一个元素(element), 每个元素的编码被称作为下标(index). JavaScript一维数组创建 ...
- Http协议访问DataSnap Rest 服务器
用TIDHttp访问DataSnap Rest服务器,在服务器采用了用户验证的情况下,客户端需要注意下面的细节,否则不能正常连接. 假如服务器有如下的用户验证: procedure TSC.DSAut ...