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   norsd  阅读(151)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示