日期:2014-05-17  浏览次数:21102 次

C#事件同步问题请教,急,请各位大牛指导
我现在做的代码功能:
调用第三方控件,通过该控件控制设备,控制设备的所有指令均为异步方式,即调用后立刻返回,控件通过事件返回设备真正的响应结果.

问题:
我在代码中调用控件方法后,接着立即等待事件结果,但是却一直等待不到,直到等待方法结束退出后,事件信息才会上送上来。 为什么每次都是等待方法推出后,事件信息才会上送上来呢?

发送指令方法()
{
    //调用控件发送指令
    ………………

    //等待指令结果,最多等待10秒
    while(true)
    {
         //结果状态已改变
         break;
     }
}

事件接收方法()
{
    //修改结果状态
}

------解决方案--------------------
你如果真想异步编程,你又“等待”干什么?

这就是说的“.net4.5里边async/await语法比较坑爹”的地方。它错误地宣传了、而且许多中国的程序猿也替它错误宣传了这个,使得更多程序猿只会用同步顺序操作的思想去“设计”异步程序。让你的程序慢100倍甚至死机这也许是小事,关键是耽误了.net framework的好名声。

你的异步程序通常是这样的,例如
void 发送指令方法(msg)
{
    var x = 获取调用的控件实例();
    x.设备响应事件 += (s,e) => 
    {
        var datas = e.接收到的信息;
        事件接受方法(datas);
    }
    x.发送指令(msg);
}


也就是说,“控件发送指令”指令之后一切就结束了,你还循环什么呢?
------解决方案--------------------
LS的大侠言之有理。

但其实有时候同步编程也是有必要的。javascript就是因为没有同步机制,有时很不方便。
------解决方案--------------------
楼主说的让给我想起之前我遇到的一个情况。
当时我是写一个SDK程序,内部有一个Socket专门连接并与一个Socket服务端通讯,而我的SDK程序只是给外部提供一系列简单的功能,也就是说在使用我的SDK程序时,只是调我的一个公开方法,而SDK要做的工作则要分为几步,1:建立与Socket服务器的连接
2:连接成功后会收到一个验证码,解析验证码,并向服务器发送解析后的验证码
3:验证成功后才可以发送请求,请求需要的数据,也就是外部调SDK需要的数据
因为这样的需求,我在外部调用SDK的方法里,用了等待,即While(True)的东东;后来发现调用这个方法,经常出现超时。
还请sp1234说的详细些,我现在还是不太懂