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