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的更多相关文章

  1. Socket层实现系列 — 信号驱动的异步等待

    主要内容:Socket的异步通知机制. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件.有数据可读事 ...

  2. .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter

    林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试.然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误. 这似乎是一个矛盾的要求.然而最终我想到了一个办法:让重试一直进 ...

  3. .NET 中什么样的类是可使用 await 异步等待的?

    我们已经知道 Task 是可等待的,但是去看看 Task 类的实现,几乎找不到哪个基类.接口或者方法属性能够告诉我们与 await 相关. 而本文将探索什么样的类是可使用 await 异步等待的? D ...

  4. .NET 中让 Task 支持带超时的异步等待

    Task 自带有很多等待任务完成的方法,有的是实例方法,有的是静态方法.有的阻塞,有的不阻塞.不过带超时的方法只有一个,但它是阻塞的. 本文将介绍一个非阻塞的带超时的等待方法.   Task 已有的等 ...

  5. 如何实现一个可以用 await 异步等待的 Awaiter

    .NET 和 C# 共同给我们带来的 async/await 异步编程模型(TAP)用起来真的很爽.为了实现异步等待,我们只需要在一切能够能够异步等待的方法前面加上 await 即可.能够异步等待的最 ...

  6. 实现一个可以用 await 异步等待的 Awaiter

    总结起来,要想使一个方法可被 await 等待,必须具备以下条件: 这个方法返回一个类 A 的实例,这个类 A 必须满足后面的条件.此类 A 有一个可被访问到的 GetAwaiter 方法(扩展方法也 ...

  7. [译]理解Javascript的异步等待

    原文链接: https://ponyfoo.com/articles/understanding-javascript-async-await 作者: Nicolás Bevacqua 目前async ...

  8. 理解Javascript的异步等待

    目前async / await特性并没有被添加到ES2016标准中,但不代表这些特性将来不会被加入到Javascript中.在我写这篇文章时,它已经到达第三版草案,并且正迅速的发展中.这些特性已经被I ...

  9. 异步等待的 Python 协程

    现在 Python 已经支持用协程进行异步处理.但最近有建议称添加协程以全面完善 Python 的语言结构,而不是像现在这样把他们作为生成器的一个类型.此外,两个新的关键字---异步(async)和等 ...

随机推荐

  1. java 获取系统当前时间

    Calendar ca = Calendar.getInstance();      int year = ca.get(Calendar.YEAR);//获取年份      int month=ca ...

  2. cookie 路径问题

    Path – 路径.指定与cookie关联的WEB页.值可以是一个目录,或者是一个路径.如果http://www.zdnet.com/devhead /index.html 建立了一个cookie,那 ...

  3. NSRunLoop概述和原理

    1.什么是NSRunLoop?我们会经常看到这样的代码: - (IBAction)start:(id)sender{pageStillLoading = YES;[NSThread detachNew ...

  4. 在Eclipse上建立hbase 0.98.3/0.96.2源代码阅读环境

    2.1. 切换到源代码目录,执行: mvn 黄色部分作用为设置代理.由于本人的编译环境在公司内网,所以需要设置代理 2.2. 生成eclipse项目环境: mvn eclipse:eclipse -D ...

  5. poj2387 spfa求最短路

    //Accepted 4688 KB 63 ms #include <cstdio> #include <cstring> #include <iostream> ...

  6. 快速排序C++

    /* * quick_sort.cpp * * Created on: 2016-3-21 * Author: Lv_Lang */ //快速排序 #include <iostream> ...

  7. css3 倒影

    说起倒影效果,在传统网页中,我们只能使用photoshop进行事先将倒影设计好,然后导入到网页中,这样不但耗费资源,也阻碍了开发的效率.而 css3新增了Reflections板块,css  Refl ...

  8. Maven工程中的右键team

    与资源库同步(S):在需要合并版本时使用 提交(C):本地代码写入源码库 更新(U):本地代码升级到服务器端版本 在点击更新时,请注意: 如果当前项目有改动(甚至是比原来多了一个空格),则此时无法更新 ...

  9. Activity 属性设置大全

    activity属性设置大全 android:allowTaskReparenting=["true"|"false"] 是否允许activity更换从属的任务 ...

  10. Makefile 开发环境全能管家

    变量的应用: CC=gcc RM=rm EXE=main.exe OBJS=目标 伪目标的应用: .PHONY:clean 自动变量的应用: $@:表示一个规则的目标 $^:表示的是规则中的所有的先决 ...