关于正在进行的设计和实现的几句话
我向远程应用程序发送了很多请求(当然,运行在不同的主机上),而应用程序则将数据发回。
关于客户端的
Client是一个UI,它生成一个单独的线程来提交和处理请求。一旦它提交了所有的请求,它就调用等待。等待将解析所有来自应用程序的事件,并调用客户端的回调。
下面是等待的实现。
public void Wait (uint milliseconds)
{
while(_socket.IsConnected)
{
if (_socket.Poll(milliseconds, SelectMode.SelectRead))
{
// read info of the buffer and calls registered callbacks for the client
if(_socket.IsAvailable > 0)
ProcessSocket(socket);
}
else
return; //returns after Poll has expired
}
}等待从一个单独的线程调用,负责管理网络连接:入站和出站流量:
_Receiver = new Thread(DoWork);
_Receiver.IsBackground = true;
_Receiver.Start(this);此线程是从应用程序的UI组件创建的。
问题:
即使主应用程序按时发送数据,客户端有时也会看到回调的延迟。值得注意的是,Poll中的消息被延迟,直到我的客户端断开连接,然后在内部调用:
_socket.Shutdown(SocketShutdown.Both);我认为在Poll中发生了一些奇怪的事情
对于如何解决这个问题或其他解决办法,有什么建议吗?
谢谢
如果有什么不清楚的地方请告诉我
发布于 2009-03-03 05:19:01
几件事。首先,在您的示例中,"_socket“和”套接字“之间有区别吗?第二,您使用的是System.Net.Sockets.Socket类,对吗?我在MSDN文档中没有看到该类上的IsConnected或IsAvailable属性,因为任何.NET版本都可以追溯到1.1。我想这都是打字错误,对吧?
您是否尝试过在"IsAvailable > 0“测试中添加”Output“子句,并将消息写入控制台/输出窗口,例如,
if (_socket.IsAvailable > 0) {
ProcessSocket(socket);
} else {
Console.WriteLine("Poll() returned true but there is no data");
}这可能会让您了解在程序的更大范围内可能发生的事情。
除此之外,我不太喜欢轮询套接字的数据。作为另一种选择,是否有理由不在套接字上使用异步Begin/EndReceive函数?考虑到您已经在使用单独的线程来发送和接收数据,我认为转换到异步模型是很简单的。这是来自MSDN的示例。此外,我还将使用该机制的典型实现添加到这是如此的帖子中。
发布于 2009-03-02 20:27:18
调用Wait()方法的线程是什么?如果您只是将其放入UI线程池中,这可能就是您有时会遇到延迟的原因。如果这是您的问题,那么要么使用系统线程池,为您的应用程序的网络部分创建一个新线程,要么为它生成一个专用线程。
除此之外,很难在不看到更多代码的情况下帮助您。
https://stackoverflow.com/questions/603677
复制相似问题