一个过程结束后如何保持端口状态

earthpea 2010-10-09 03:47:25
大家好,我在改写一个程序,现在有一个问题要请教:
原来的程序是这样的:

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文件,供其他项目调用的,因此没办法直接在代码中写循环发送的。

谢谢大家。
...全文
62 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
earthpea 2010-10-09
  • 打赏
  • 举报
回复
搞定了,万分感谢:)
bobyisland 2010-10-09
  • 打赏
  • 举报
回复
    
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);
}
}
earthpea 2010-10-09
  • 打赏
  • 举报
回复
谢谢楼上的各位,因为我平时都是使用vb.net多一些,C#很少接触,这次是因为需要进行代码修改,呵呵。

---至于Open和Close完全都可以让调用者去显示调用,没必要你在里面都默默的完成了。

我就是准备写好后,调用者就可以先open,N次sendex,最后调用close的方式来使用。

还要麻烦大家给出一个范例了~~
bobyisland 2010-10-09
  • 打赏
  • 举报
回复
分开写是对的,但如果想保持这个client变量的状态就需要将其独立出来。另,使用using语句时,这个client变量会在using结束后释放的,因此,每次调用Send函数,得到的都是一个全新的client。把逻辑改下就应该可以了吧。还有,至于Open和Close完全都可以让调用者去显示调用,没必要你在里面都默默的完成了。
suanhouming 2010-10-09
  • 打赏
  • 举报
回复
个人认为 你写的程序有问题,using在用于创建对象时,只在函数内部有效,client是空引用了,Open方法一结束就无效了!!!

只是随便说说,不一定对!!!
a174740341 2010-10-09
  • 打赏
  • 举报
回复
友情帮顶

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧