异步等待(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)和等 ...
随机推荐
- 两种PHP生成二维码的方法
PHP生成二维码,个人认为最常用的有两种,1.使用google的api生成,2.使用PHP QR Code生成,两种方法生成的二维码都是很清淅的,效果不错.下面来分别说明这两种方法如何实现. 一.PH ...
- 并发编程 17—— Lock
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- div被object覆盖的解决办法
代码: <div id="contextmenu" style="width: 120px; height:120px;DISPLAY: none; top: 26 ...
- WebView注入Java对象注意事项
在android4.2以前,注入步骤如下: webview.getSetting().setJavaScriptEnable(true); class JsObject { public String ...
- 读javascript高级程序设计11-事件
一.事件流 事件流指从页面中接收事件的顺序. 1.事件冒泡(常用) IE中采用的事件流是事件冒泡,先从具体的接收元素,然后逐步向上传播到不具体的元素. 2.事件捕获(少用) Netscapte采用事件 ...
- PHP过滤外部链接及外部图片 添加rel="nofollow"属性
原来站内很多文章都是摘录的外部文章,文章里很多链接要么是时间久了失效了,要么就是一些测试的网址,如:http://localhost/ 之类的,链接多了的话,就形成站内很多死链接,这对SEO优化是很不 ...
- EMS问题
如果EMS启动后在运行时报出 JMS error: "Not allowed to create destination这个错误,可能就是你启动方式的问题了 进入到EMS的安装目录的bin目 ...
- 最小割 总结&&做题记录
模型要点: 1.一般适用于二取一问题或者01规划. 2.利用最小割=最大流,转化为最大流求之. 建议阅读胡伯涛的论文 <<最小割模型在信息学竞赛的应用>>,有精彩有序的证明和各 ...
- movebase导航
利用turtlebot 的导航配置文件 由于movbase发的速度太不友好了所以使用了ros自带的滤波安装相应的包 apt-get install ros-indigo-yocs-velocity-s ...
- AngularJS拦截器
AngularJS是通过拦截器提供了一个全局层面对响应进行处理的途径.拦截器实际是$http服务的基础中间件,用来向应用的业务流程中注入新的逻辑,其核心是服务工厂,通过向 $httpProvider. ...