异步Beginreceive怎么中止调用?(内详)

juventusland 2011-12-30 03:03:52
我的程序是利用异步,从客户端发送信息,然后接受服务器的信息。 问题在于在过程之中我要连续发送3条信息得到不同的回馈,但是在第一次BEGINRECEIVE调用异步操作时,就会陷入不停接收的循环(就是每隔N秒会刷新数据,重新接收)。 我实在是看不出来为什么会陷入这个循环,所以我想请教下有没有让第一次接收停止,并且不关闭SOCKET,接下来继续发送第二条信息,接收第二条信息的回馈。

大致就是要实现下面的目的(这里使用了FOREACH,总之就是要逐条完成发送接收)
foreach (string tmpcmd1 in cmdstate1a)
{
while (con1)
{
sendADone.Reset();
SendA(socketClient1a, tmpcmd1); //check status
sendADone.WaitOne();

receiveADone.Reset();
ReceiveA(socketClient1a); //ok, absorb output line
receiveADone.WaitOne();
printClientMsg(socketClient1a, response);

Thread.Sleep(1000);
}
}
但是执行到ReceiveA这一步时就会陷入循环,能不能设定时间阙值或者接收比特阙值来强制结束这一循环啊?(最好能附上较详细的CODE)。。非常感谢啊。。现在整个程序就纠结在这里。
...全文
289 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
juventusland 2011-12-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zdbb 的回复:]

异步 BeginReceive 操作必须通过调用 EndReceive 方法来完成。通常,该方法由 callback 委托调用。

此方法在操作完成前不会进入阻止状态。若要一直阻塞到操作完成时为止,请使用 Receive 方法重载中的一个。

若要取消挂起的 BeginReceive,请调用 Close 方法。

有关使用异步编程模型的详细信息,请参见 使用异步方式调用同步方法。
……
[/Quote]
。。。。如果ENDREceive 有用的话就没那么麻烦了。。。。CLOSE的话直接会把SOCKET关闭了啊,但是我接下来还是要用这个SOCKET。 有没有办法只是关闭当前线程,以让接受数据中止,执行下一线程。。。
只在此山中 2011-12-30
  • 打赏
  • 举报
回复
异步 BeginReceive 操作必须通过调用 EndReceive 方法来完成。通常,该方法由 callback 委托调用。

此方法在操作完成前不会进入阻止状态。若要一直阻塞到操作完成时为止,请使用 Receive 方法重载中的一个。

若要取消挂起的 BeginReceive,请调用 Close 方法。

有关使用异步编程模型的详细信息,请参见 使用异步方式调用同步方法。
转自MSDN
(注意使用前先将IP改为自己的IP或127.0.0.1) 本软件是使用套接字、ReceiveCallBack(IAsyncResult AR)函数为例的客服实例,修正了关闭客户端会导致异常的Bug;并且还是一个RichTextBox颜色使用的范例,不同的事件使用不同的颜色:如用户登录用红色、用户名用绿色、聊天内容用黑色^_^! 代码附赠全套注释,帮助初学者学习使用。 下面是核心代码 private void ReceiveCallBack(IAsyncResult AR) { try { DateTime dt = DateTime.Now; //如果服务器突然关闭后,客户端还坚持与之连接就会弹出异常; //检查是否套接字还连接上就可以避免这一问题。 if (!ClientSocket.Connected) { return; } //挂起AR,独占的使用AR来接收传过来的内容 int REnd = ClientSocket.EndReceive(AR); string StrOfREnd=Encoding.Unicode.GetString(MsgBuffer, 0, REnd); //截断的传输过来的字符串,"\n"前的是用户名 "\n"后的是聊天的内容 string UsersName = StrOfREnd.Substring(0, StrOfREnd.LastIndexOf("\n")); string Content = StrOfREnd.Substring(StrOfREnd.LastIndexOf("\n")+1); string Login=StrOfREnd.Substring(0,2); //MessageBox.Show("缓存中的内容:" + StrOfREnd + "\n" + "截断的用户名:" + UsersName + "\n" + "截断的内容:" + Content); if (Login != "登录") { //第一个字符不为“登陆” int oldlenth = tb_RecieveMsg.TextLength; this.tb_RecieveMsg.Select(oldlenth, 0); this.tb_RecieveMsg.SelectionColor = Color.Green; string str = Encoding.Unicode.GetString(MsgBuffer, 0, REnd); str = str.Substring(1, str.Length - 1); //用户使用绿色字体 this.tb_RecieveMsg.AppendText(" " + string.Format("{0:T}", dt) + " " + "用户:" + UsersName + "说:" + "\r\n"); this.tb_RecieveMsg.SelectionColor = Color.Black; this.tb_RecieveMsg.AppendText(" " + Content + "\r\n"); this.tb_RecieveMsg.AppendText("\r\n"); } else {

110,536

社区成员

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

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

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