C# socket通信服务器异步问题

前提:需要设计一个服务器开启线程监听客户端的连接,连接成功后读取客户端发送的数据进行解析,对不同的数据信息进行不同的操作(有界面UI操作)。

出现的问题:步骤一接收到数据①后需要将一个window窗口弹出,步骤二接收到数据②后将数据显示在window窗口上,问题就出现步骤二,接收不到数据②,只有当window窗口关闭后才能接收数据②。当时的逻辑代码是这样处理的:

开启服务器并开启线程监控客户端的连接

监听客户端的连接

接收客户端发送的数据

这里其实有两个问题:

问题①:byte[] buffer = new byte[4096];  int bytesRead;应该放在while循环里面,如果接收数据很多次4096字节就不够用了

问题②:await Task.Run(() => SwitchModule(message));   await 的作用是异步等待 。实际上是在当前异步方法(ProcessClient)中异步地等待 Task.Run 返回的任务完成。这意味着 await 会暂停当前方法的执行,直到 Task.Run 中的任务完成,当 await 被调用时,当前方法的执行会暂停,并释放当前线程。

所以当window窗口没有关闭时,他会一直等待窗口任务完成,所以无法接收到数据②。

修改为Task.Run(() => SwitchModule(message)); 

Task.Run 会立即返回一个 Task 对象,但代码会继续执行下一行,而不会等待 Task.Run 中的任务完成。这意味着 SwitchModule 函数的执行将与当前方法的其余部分并行进行。

问题解决ok

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值