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