我在看一个多线程代码,其中有以下代码片段:
......
CardNum = 0;
                    int fCmdRet = 0x30;
                    Application.DoEvents();
                    this.Invoke((EventHandler)delegate
                    {
                        fCmdRet = RWDev1.Inventory_G2(ref fComAdr, AdrTID, LenTID, TIDFlag, EPC, ref Totallen, ref CardNum, frmcomportindex);
                    });
                    Thread.Sleep(200);
......从int fCmdRet = 0x30;语句之后的代码不太明白,请高手给解释解释,谢谢!

解决方案 »

  1.   

    主要是不明白为什么要把RWDev1.Inventory_G2()放在this.Invoke((EventHandler)delegate中。
      

  2.   

    int fCmdRet = 0x30;0x30ASCII编码,至于后边的代码我也不太清楚,应该是跟委托事件有关吧
      

  3.   

    Invoke()的作用是:在应用程序的主线程上执行指定的委托。一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); 
      

  4.   

    本线程要想调用可能被其他线程使用的资源,需使用invoke方法或者是begininvoke方法,否则不同的线程会争用同一资源引发异常。
      

  5.   

    Application.DoEvents();
    //这个貌似是执行了排队的时间                    this.Invoke((EventHandler)delegate
                        {
                            fCmdRet = RWDev1.Inventory_G2(ref fComAdr, AdrTID, LenTID, TIDFlag, EPC, ref Totallen, ref CardNum, frmcomportindex);
                        });
    //这个是做了Invoke,括号里的是具体执行的内容,是一个委托
                        Thread.Sleep(200);
    //sleep 200
      

  6.   

    木的解释,这是一个规定,到规定层面那就没有任何解析了,规定你不能迟到,迟到一秒扣50,你能有啥子办法之所以后面那么写,是因为微软规定,你不可以跨线程直接操作某些东西,所以只能变相使用invoke去对操作他这就好比你公司规定迟到要扣钱,但是同时也规定你可以申述理由,理由成立也可以不扣钱一样,这都是规定了木办法解释
      

  7.   

    Application.DoEvents() 这是沿用 vb(vb3~vb6?或许更早)的写法。因为vb天生就是单线程的,这一点它远远不如vc。Application.DoEvents()其实就是递归调用,让windows消息泵中的消息回调方法提前执行。因此在vb中经常造成这种尴尬的局面,一方面调用DoEvents来递归调用消息泵,另一方面意外插入的消息处理代码又会引起更多消息压入消息泵,所以DoEvents代码稍有不慎就会造成狂吃内存、让程序宕机的危险。不过vb程序员除了这点本事,还能如何写出貌似“多线程”的程序呢?没有别的办法,只能使用DoEcents。vb6中很多机制在.net中都有体现,因为当时需要把大量vb程序(半)自动化地移植到vb.net上。而 Invoke,你应该看看msdn等资料。它阻塞了当前线程的执行,将线程上下文切换到主线程上,来执行delegate里边的代码,这样就能避免同样在主线程执行的其它指令与这些代码交互执行、相互侵压、造成数据冲突。微软规定所有界面控件都不打算花巨大的精力做成线程安全的,用户调用控件时都必须调用这个方法使得它们只能主线程上执行,从而回避了多线程会造成控件内部状态数据混乱的问题。至于最后的Sleep(200),我不知道干什么用的。编程序不要无缘无辜地阻塞自己,不要没事闲着。如果无事可干,即把程序结束(return)就好了,释放线程资源。不要闲着没事去阻塞自己。
      

  8.   

    比如说鼠标移动了一下,那么执行到  Application.DoEvents(); 这个时候,mouse_move 事件处理程序就被执行了。不过我强调了,作为一个c#程序员,你最好不要调用这个代码。