我在调试别人代码时,遇到异步调用的问题,产生的现象如题所描述。
在异步代码之前是用process.start(一个bat文件,该文件连接远程主机,并传文件过去),如果文件打开了,则执行异步代码。
特别不解得是:当我在本地写个cs文件直接调这个方法时,是可以正常运行的,能把文件传出去,但是当我把这段代码用一个webservice的方法去调用,并另写一个client调这个webservice的时候,waitall就超时,EndInvoek也没反应,有没有人知道怎么回事?看了两天资料了 也没头绪 ,请大家帮忙看下,下面贴段代码//委托定义
 private delegate string StringDelegate();//异步的部分代码,start方法打开的是一个bat文件
 if (shellProcess.Start())
                {
                  StringDelegate outputStreamAsyncReader = new StringDelegate(shellProcess.StandardOutput.ReadToEnd);
                  StringDelegate errorStreamAsyncReader = new StringDelegate(shellProcess.StandardError.ReadToEnd);
                  IAsyncResult outputAR = outputStreamAsyncReader.BeginInvoke(null, null);
                  IAsyncResult errorAR = errorStreamAsyncReader.BeginInvoke(null, null);                  WaitHandle[] arWaitHandles = new WaitHandle[2] { outputAR.AsyncWaitHandle, errorAR.AsyncWaitHandle };
                  WaitHandle.WaitAll(arWaitHandles, dieAfterSeconds * 1000, false);                                       
                    if (shellProcess.HasExited)
                        exitCode = shellProcess.ExitCode;
                    else
                        exitCode = -1;
                    error = errorStreamAsyncReader.EndInvoke(errorAR);
                    output = outputStreamAsyncReader.EndInvoke(outputAR);
                    
                }

解决方案 »

  1.   

    什么意思?毫无道理的程序。阻塞也算异步程序?你不过是调用了异步(BeginXXX)代码,却做了同步阻塞的事情而已。那么接下来的问题就是,阻塞被解除的条件是什么?就好象我们进入地铁时,闸门阻挡了我们,我们只要塞一张票就能让一个人通过地铁。你如果攥着票却在那里发呆,等着闸门超时,那就慢慢等吧!这类程序我懒得看、改。要写真正异步操作代码,要记住每当执行BeginXXX之后,程序就完成了,线程就继续做以后的事去了,而不是阻塞在那里。然后当有返回值,异步操作的回调方法就会被自动在新的线程上执行。这才是异步操作!
      

  2.   

    调试“别人代码”。如果你在一个好的团队中,那么你就应该删除这“别人的代码”,然后看看哪些系统测试用例会测试出这个程序的bug,然后真正用异步操作代码重写这个程序,只要让测试通过就对了。代码狗屁也不是,不要抄别人的代码,完成程序功能并且让测试通过才是重要的,任何人可以重写代码来替代别人的代码。