大家好,我在改写一个程序,现在有一个问题要请教:
原来的程序是这样的:public void  Send(服务器,端口,信息)
{
  using (client = new SendClient);
    {
    //1、打开端口,验证信息;(Connect)
    client.Connect(服务器, 端口);
    //2、发送信息;(SendMessage);
    client.Send(信息)
    //3、关闭端口(Quit)
    client.Quit();
    }
}在使用的时候,调用Send就可以发送信息,但如果有多条记录,每次都要打开端口、验证信息,发送后关闭端口,大量的时间都花费在了第一步,例如每发送一次信息的时间为15秒的话,第一步就占用了12秒,我现在想将这个函数改写为三个,打开端口并验证后,一条条的发送信息,信息发送完成后再关闭端口,三个函数分别是:
public void Open(服务器,端口)
{
  using (client = new SendClient);
    {
    //打开端口,验证信息;(Connect)
    client.Connect(服务器, 端口);
    }
}public void SendEx(信息)
{
  using (client = new SendClient);
    {
    //发送信息;(SendMessage);
    client.Send(信息)
    }
}
public void Close()
{
  using (client = new SendClient);
    {
    //关闭端口(Quit)
    client.Quit();
    }
}
这样一来,问题就出现了,我在使用时执行Open(服务器,端口)成功,但在执行SendEx(信息)就报错,我试着再执行Close()也不行,后来发现,执行Open(服务器,端口)成功后,这个过程就已经结束了,如果再执行第二步或第三步就会报错,例如我只执行第一、三步(不发送信息,只打开就关闭),将Close()中加入一条client.Connect(服务器, 端口);再client.Qiut()的话,就成功了,但时间也从我就变成了近30秒。
我想请教大家的是,我应该如何处理,才能执行完Open后继续执行SendEx时,可以使用上一个函数打开的端口信息呢?注:因为这段代码是写好后生成为DLL文件,供其他项目调用的,因此没办法直接在代码中写循环发送的。谢谢大家。

解决方案 »

  1.   

    个人认为  你写的程序有问题,using在用于创建对象时,只在函数内部有效,client是空引用了,Open方法一结束就无效了!!!只是随便说说,不一定对!!!
      

  2.   

    分开写是对的,但如果想保持这个client变量的状态就需要将其独立出来。另,使用using语句时,这个client变量会在using结束后释放的,因此,每次调用Send函数,得到的都是一个全新的client。把逻辑改下就应该可以了吧。还有,至于Open和Close完全都可以让调用者去显示调用,没必要你在里面都默默的完成了。
      

  3.   

    谢谢楼上的各位,因为我平时都是使用vb.net多一些,C#很少接触,这次是因为需要进行代码修改,呵呵。---至于Open和Close完全都可以让调用者去显示调用,没必要你在里面都默默的完成了。我就是准备写好后,调用者就可以先open,N次sendex,最后调用close的方式来使用。还要麻烦大家给出一个范例了~~
      

  4.   

        
        class CSendMsg
        {
            private bool m_bIsConnected = false;
            private SendClient m_Client = null;        public bool IsConnected
            {
                get { return m_bIsConnected; }
                private set { m_bIsConnected = value; }
            }        public bool Connect(string strSvr,int nPort)
            {
                if (IsConnected)
                    return IsConnected;
                if (null == m_Client)
                    m_Client = new SendClient();
                return IsConnected = m_Client.Connect(strSvr, nPort);
            }        public void Close()
            {
                System.Diagnostics.Debug.Assert(null != m_Client);
                if (null != m_Client)
                    m_Client.Close();
                IsConnected = false;
            }        public bool Send(string strMsg)
            {
                System.Diagnostics.Debug.Assert(null != m_Client);
                if (null == m_Client)
                    return false;
                return m_Client.Send(strMsg);
            }
        }