我主要想实现两个进程间通信,一个进程发送一个字符串给另一个进程,现在问题是我对一个进程做了如下的处理,即我在该进程中新开了一个线程来调用了waitforconnection()函数等待另一个进程连接该管道并发送数据,然后呢我现在还没启动另外一个进程来连接这个管道的时候,我想关闭此程序。但是调试的时候发现关闭了界面,但是程序依然在运行,我猜测是不是我退出时未关闭线程,后来在结束时调用thread.abort()终止线程。
    问题:是不是调用了waitforconnection()后未等到连接时,无法调用Thread.abort来终止线程? 
         NamedPipeServerStream pipeServer = new NamedPipeServerStream("yokogawa", PipeDirection.InOut);
            try
            {                
                pipeServer.WaitForConnection();
                using (StreamReader sr = new StreamReader(pipeServer))
                {
                    string temp;
                    if ((temp = sr.ReadToEnd()) != null)
                    {
                        if (this.InvokeRequired)
                        {
                            this.Invoke(new DelegatePipeForm(PipeForm),
                                            new object[] { temp });
                        }
                        else
                        {
                            this.PipeForm(temp);
                        }
                    }
                }
            }
            catch (IOException ex)
            {
                MessageBox.Show("ERROR:" + ex.Message);
            }

解决方案 »

  1.   

    看似是命名管道通讯,你在代码pipeServer.WaitForConnection();上加入断电,然后运行程序,执行到断点时按F10,如果程序继续往下走就没问题,不走说明这个函数是一直在等,直到有人连接,可能是它造成的。
    这种通讯最好使用成型的服务来做,如WCF。何必自己去写底层的代码,又要制定协议,出了错也很难解决。你才做了几年程序,能和微软比?
      

  2.   

    首先谢谢你的建议,它就是命名管道通信,而且肯定会在waitforconnection处等待连接的,主要是看有没有办法能够终止等待!4楼提到了如果不在一个新的线程,直接关闭界面是可以释放的,如果在一个新的线程则没法释放。要实现通信的话sendmessage就可以,主要是想明白这种情况为什么而已。
      

  3.   


    这个就不好说了,建议你用windbg调试一下,搞成IL,看看abort时发生了什么,或许可以找到答案,期待...