ErrorObject OpenAsync(Action<ErrorObject>arg_fnRet)

 public static ErrorObject Open(this ReadWrite arg_rw,IPEndPoint arg_ipport)
{
var smph = new Semaphore(0, 1);
var eo = ErrorObject.True;
eo = arg_rw.OpenAsync(arg_ipport, eoi =>
{
eo = eoi;
smph.Release();
});
if(eo.IsFalse)
return eo;
smph.WaitOne();
return eo;
}

上面调用其实有可能是有问题的

eo = arg_rw.OpenAsync(...) 这个eo用于检测arg_rw.OpenAsync在初期是否出现错误,一般都是没有错误的,所以可以认为总是返回True

如果OpenAsync是使用Sync(同步)模式实现了Action()而且返回了false,这时就出现了问题!

1. arg_OpenAsync开始运行

2. Action同步执行,eo = eoi; eoi是False , smph.Release();(此时由于OpenAsync使用了Sync实现,所以smph无关紧要)

3.arg_OpenAsync执行完毕,由于没有错误所有返回的是一个ErrorObject.True  , 所以此时 eo 被赋值了新值 ErrorObject.True

4. 最后得到的结果错误!

正确的写法:

public static ErrorObject Open(this ReadWrite arg_rw,IPEndPoint arg_ipport)
{
var smph = new Semaphore(0, 1);
var eo = ErrorObject.True;
var eoI = ErrorObject.True;
eo = arg_rw.OpenAsync(arg_ipport, eoi =>
{
eoI = eoi;
smph.Release();
});
if(eo.IsFalse)
return eo;
smph.WaitOne();
return eoI;
}

ErrorObject OpenAsync(Action<ErrorObject>arg_fnRet)的更多相关文章

  1. 正式学习React(五) react-redux源码分析

    磨刀不误砍柴工,咱先把react-redux里的工具函数分析一下: 源码点这里  shallowEqual.js export default function shallowEqual(objA, ...

  2. React系列——react-redux之connect方法解析

      connect简介 前方高能预警,有耐心才能看完文章!! react-redux仅有2个API,Provider和connect,Provider提供的是一个顶层容器的作用,实现store的上下文 ...

  3. redux-amrc:用更少的代码发起异步 action

    很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...

  4. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  5. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  6. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  7. SpringMVC的Action在同一时间里只允许同一个浏览器的单次进入?

    最近用SpringMVC写了一个很简单的测试程序,代码如下: @Controller public class LongTimeTaskController { @RequestMapping(val ...

  8. No result defined for action com.lk.IndexAction and result success

    意图访问一个 /es/index.action 竟然出现: [SAE ] ERROR [05-11 13:54:32] [http-80-5] com.opensymphony.xwork2.util ...

  9. 实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

    MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Fi ...

随机推荐

  1. android-problem——remount of /system failed: Read-only file system

    adb remount后仍旧不能对system进行读写.需要进行adb disable-verity 在Android6.0 (Android M)userdebug版本上(eng版本不存在该问题), ...

  2. HDOJ 1217 Arbitrage(拟最短路,floyd算法)

    Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  3. sphinx的配置和管理

    网上配置文档众多,但是对着他们的文档来做老是出问题,于是花了点时间研究了一下,写成总结,方便以后查阅.也希望学习sphinx的朋友能少走弯路.Coreseek的安装请参考:http://blog.ch ...

  4. WebSocket 和 Socket 的区别

    WebSocket 和 Socket 的区别   英文:TheAlchemist 链接:http://www.jianshu.com/p/59b5594ffbb0 <刨根问底 HTTP 和 We ...

  5. day 18 面向对象的 继承

    一.概念性知识 面向对象的三大特征:     继承,多态,封装 继承是创建新类的一种方法,在python中,新建的类可以继承一个或多个父类,父类称作基类或超类,新建的类又称作派生类或子类. 继承的好处 ...

  6. HDU 6155 Subsequence Count 线段树维护矩阵

    Subsequence Count Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Oth ...

  7. java基础知识一

    1.计算机基础知识概述 (1) 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处 ...

  8. SpringMVC配置环境中一般用的jar包

    配置SpringMVC需要把这些jar包加入lib目录下 下载地址,复制到地址栏.回车即可下载 http://files.cnblogs.com/files/QW-lzm/SpringMVC----. ...

  9. hdu 超级楼梯 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2041 哦--对了,这些题读者可以直接忽略,我只是想练习一下自己薄弱的地方...... 题目意思我就不说 ...

  10. codeforces 667D D. World Tour(最短路)

    题目链接: D. World Tour time limit per test 5 seconds memory limit per test 512 megabytes input standard ...