Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在接收流之前等待服务器_C#_Sockets_Asynchronous_Client Server - Fatal编程技术网

C# 在接收流之前等待服务器

C# 在接收流之前等待服务器,c#,sockets,asynchronous,client-server,C#,Sockets,Asynchronous,Client Server,我正试图在此基础上实现一个客户机-服务器套接字系统,我已经让它正常工作了。如果我这样做,当服务器立即返回字符串时,它就可以正常工作 client.send(); client.receive(); 问题是,如果我的send方法请求的内容需要服务器几分钟才能处理,例如创建一个PDF版本的文件,那么receive调用会立即执行,但什么也没有收到(因为服务器在处理PDF文件时没有发送任何内容) 如何让客户端在执行receive方法之前等待一段时间,以便在服务器完成处理并发送文件后调用它?这似乎是阻塞

我正试图在此基础上实现一个客户机-服务器套接字系统,我已经让它正常工作了。如果我这样做,当服务器立即返回字符串时,它就可以正常工作

client.send();
client.receive();
问题是,如果我的send方法请求的内容需要服务器几分钟才能处理,例如创建一个PDF版本的文件,那么receive调用会立即执行,但什么也没有收到(因为服务器在处理PDF文件时没有发送任何内容)


如何让客户端在执行receive方法之前等待一段时间,以便在服务器完成处理并发送文件后调用它?

这似乎是阻塞和非阻塞receive调用之间的区别。阻塞接收调用将等待,直到它实际有东西要接收,否则将超时。无论数据是否存在,非阻塞接收呼叫都会立即返回。我不知道这是什么叫法,但我知道C#有两种叫法

您给出的链接指向一个异步套接字示例,该示例通常与您尝试执行的操作不同。您试图做的更类似于同步样式

就套接字而言,异步通常意味着您将注册一个函数,以便在接收数据时调用。同步是指以阻塞或非阻塞方式轮询(显式请求数据)

编辑: 您可以发送数据,并设置一个类变量,表示您已发送了一些内容,并且希望收到一些内容。然后等待该变量被清除,表明您收到了一些信息

sent = 1
client.send()
while(sent);
然后,在接收回调中,当您实际获得某个内容时,您将设置该变量

/* receive data and process */
sent = 0;

使用async和wait。函数将在调用返回后被调用


正如spartacus所说,您似乎正在寻找的是同步服务器套接字。谢谢您的回复。如果我必须坚持使用async,那么当数据准备就绪时,我将如何取回数据?