WCF有关问题及串口

WCF问题及串口
本帖最后由 WYPGOOD 于 2015-04-07 18:53:48 编辑
我做了一个WCF服务宿主在WPF上。用来监控COM上接的MODEM是否有正常工作(MODEM有3个)。当发现有MODEM工作不正常则发送短信通知管理员后再打电话提醒管理员。问题:
当发送完短信后,管理员也收到了短信。此时WPF窗口及WCF就退出了。在DEBUG下没有扑捉到异常。代码:
 private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            ExSerialPort sptemp = (ExSerialPort)sender;
            ComObject co = new ComObject();
            StringBuilder readedmsg = new StringBuilder();
            try
            {
                Thread.Sleep(100);
                int rc = 0;
                while (rc < 20)
                {
                    if (sptemp.BytesToRead > 0)
                    {
                        readbytemsg = sptemp.ReadExisting();
                        readedmsg.Append(readbytemsg);
                        if (readbytemsg.IndexOf(">") >= 0)
                        {
                            sptemp.IsWaiteSend = true;//等待发送                                                                                                          
                            //rc = 21;
                            break;
                        }
                    }
                    else
                    {
                        rc++;
                        Thread.Sleep(50);
                    }
                }
                
            }
            catch(Exception er)
            {               
                throw new Exception(er.Message);                
            }
            finally
            {
                sptemp.ReceivedBytesThreshold = 1;
                co.CurrentEsp = sptemp;
                co.CurrentStr = readedmsg.ToString();
                readedmsg = null;
                sptemp.ReadOverTime = DateTime.Now;
                ThreadPool.UnsafeQueueUserWorkItem(ProcessFromComMsg, co);
                ProcessFromComMsg(co);
            }
        }
  private void ProcessFromComMsg(object receivemsg)
        {
            /* 完成以下内容:
             * 1、将串口收到的信息保存到日志文件
             * 2、保存新短信到ReceviceSmsContent
             */
            try
            {
                ComObject receiveObject = (ComObject)receivemsg;//这是一个结构类型,有COM对象
                // 写日志
                FileManager.WriteLogFile(receiveObject.CurrentStr, receiveObject.CurrentEsp.PortName);                
            
                    //处理常规查询数据
                    if (!string.IsNullOrEmpty(receiveObject.CurrentStr))
                    {                    
                      
                        //未读短信清单
                        if (receiveObject.CurrentStr.Contains("+CMGL:"))
                        {
                            GetSmsContent(receiveObject.CurrentStr);
                        }
                        if (receiveObject.CurrentStr.Contains("ERROR"))
                        {                           
                            receiveObject.CurrentEsp.NowSendSms = null;
                            receiveObject.CurrentEsp.IsWaiteSend = false;
                            receiveObject.CurrentEsp.initErrCount++;
                        }
                        if (receiveObject.CurrentStr.Contains("DISCONNECTED") || receiveObject.CurrentStr.Contains("RELEASED"))
                        {                          
                            receiveObject.CurrentEsp.NowSendSms = null;                           
                            receiveObject.CurrentEsp.IsAtd = false;
                        }
                        if (receiveObject.CurrentStr.Contains("+CMGS:"))//receiveObject.CurrentStr.Contains("OK") && 
                        {
                            receiveObject.CurrentEsp.IsAtd = true;
                            //receiveObject.CurrentEsp.yesRec = 1;//已读完数据
                            receiveObject.CurrentEsp.NowSendSms = null;
                            receiveObject.CurrentEsp.IsWaiteSend = false;
                        }
                      
                        ProcessSendEvent(receiveObject.CurrentEsp);//发送信息
                    }
                    else
                    {
                        receiveObject.CurrentEsp.initErrCount++;//记得错误次数
                    }
                    
                }
            }
            catch (Exception er) { throw new Exception(er.Message); }

 private void ProcessSendEvent(ExSerialPort esp)//ExSerialPort是自定义的类,继承SerialPort
        {
          
            try
            {                
                if (esp.IsWaiteSend)//IsWaiteSend判读是否是接受发送信息状态
                {
                    esp.Write(esp.NowSendSms + CustomEnum.Constant.Ctrl_zStr);
                    esp.IsWaiteSend = false;
                    esp.NowSendSms = null;
                }
               Thread.Sleep(100);
               if (esp.IsAtd)
                {
                    esp.Write(CustomEnum.AtOrder.ATD + esp.RecPhone.Trim() + ";" + CustomEnum.Constant.LineBreak);                    
                    esp.IsAtd = false;
               }
                //Thread.Sleep(100);
                //if (esp.DelYN)
                //{
                //    esp.Write(CustomEnum.AtOrder.AT_CMGD.CMGD_readed);
                //    Thread.Sleep(300);
                //    esp.DelYN = false;
                //}
            }
            catch (Exception er) { throw new Exception(er.Message); }
            esp.yesRec = 1;//本次数据是否处理完成,1表示完成
当运行完  esp.yesRec = 1;语句后,wpf和WCF即退出。
------解决思路----------------------
进程异常,先不要写文本。