我有一个使用TClientSocket用Delphi编写的应用程序,它向另一个用C#编写的应用程序发送数据。由于许多原因,C#应用程序响应缓慢,阻塞了我的Delphi应用程序,不尊重我设置的超时。
我的Delphi应用程序的响应如下:
Sock.Socket.ReceiveText这将导致应用程序等待响应。但是,如果我这样做,应用程序等待并尊重超时:
while not receiveData do
begin
if Sock.Socket.ReceiveLength > 0 then
begin
receiveData := True;
end;
Inc(Cont);
Sleep(100);
if (Cont > 10) then
raise Exception.Create('Timeout');
end;我的Delphi应用程序发送了两个请求。第一次超时,但C#仍在处理它。然后我的Delphi应用程序发送第二个请求,这次C#为第一个请求发送响应。
第二个请求会接收第一个请求的数据吗?或者,当我在Delphi中超时时,他们会交叉信息吗?
发布于 2016-09-06 17:23:28
一旦您的Delphi代码超时,它就会忘记第一个请求,但是您的C#代码不知道这一点。由于没有删除连接,第二个请求实际上将接收第一个请求的响应数据。通过实现超时逻辑,然后忽略超时的原因,您将使您的两个应用程序彼此不同步。因此,要么使用更长的超时时间(或者根本不使用超时),要么在发生超时时删除连接。
至于您的Delphi应用程序冻结,只有当您在阻塞模式下使用TClientSocket组件并在主UI线程的上下文中执行您的读取时,才会发生这种情况。您不应该在主UI线程中使用阻塞模式。以下任一项:
TClientSocket,只在OnRead事件中进行所有读取,并且不读取超过ReceiveLength指示的内容。TClientSocket,并在工作线程中执行所有读取操作,然后只有在有数据可供其处理时才向主UI线程发出信号(最好是处理工作线程中的数据,并在进行UI更新时只与主线程同步)。https://stackoverflow.com/questions/39354325
复制相似问题