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