ErrorObject OpenAsync(Action<ErrorObject>arg_fnRet)

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;
        }



posted on 2014-02-08 22:36  norsd  阅读(151)  评论(0编辑  收藏  举报

导航