异步等待(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)和等 ...
随机推荐
- MVP 个人理解2
根据我的理解,画了个图 这次又看了下 较复杂点的例子. 往往一个项目有多个部份,我们可以按功能分成几个activity, 每个activity有自己的view和数据model,因此也有自己的逻辑 pr ...
- myeclipse注册码生成器
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...
- iOS开发UI篇—Quartz2D(自定义UIImageView控件)
iOS开发UI篇—Quartz2D(自定义UIImageView控件) 一.实现思路 Quartz2D最大的用途在于自定义View(自定义UI控件),当系统的View不能满足我们使用需求的时候,自定义 ...
- nodejs gulp less编辑
nodejs 下载地址:http://pan.baidu.com/s/1bnz2oPp 提取密码:0mip 1.最简单的编译less 在安装好nodejs后,cmd 进入控制台 安装 lessc : ...
- 什么是CPA, CPS, CPT?
在互联网上或移动端进行产品推广时,经常听到很多术语,什么CPA,CPS,CPT等等.不知是怎么来的,今天网上搜一下术语,在这里做一下笔记. CPA(Cost Per Action) 每行动成本. CP ...
- 58.com qiyi
using AnfleCrawler.Common; using System; using System.Collections.Generic; using System.Linq; using ...
- iOS UITableViewCell 中 调整imageView 的图片大小
在我的项目中,很多地方都希望将UITableViewCell 中的imageView 能根据自己图片的大小来进行展示,而就为了解决这个问题又觉得重写UITableViewCell 很不值得. 如下: ...
- CSS第一天总结
CSS是层叠样式表,其作用在我看来就是统一一个或多个元素或者ID.class等的属性,CSS可以定义的属性非常多,一个好看的网页离不开CSS的修饰. CSS简而言之就是三个部分:选择符.属性.属性值. ...
- android基础(三)ContentProvider
ContentProvider主要用于在不同的应用程序之间实现数据共享,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性,目前内容提供其实android实现跨 ...
- Genymotion--最快的安卓模拟器 测试与模拟APP应用必备
命令行工具,Eclipse插件,多操作系统 1 易于安装,易于运行 超过10个虚拟设备 您很匆忙?您想测试市场的主要设备?使用我们的虚拟设备! 2 控制功能强大的传感器来测试您的应用程序 自定义你的测 ...