我在LAN应用程序中工作,此应用程序将从许多客户端接收连接
在许多情况下,我必须确保我尝试与之通信的客户端,它已经在向其发送任何数据之前已经连接,因此我创建了当前连接的客户端列表,以及一种连续发送“测试数据包”的方法,如如下
我将主UI线程与另一个线程分开,我稍后会参考它
我创建公共课来管理沟通过程
public class Listner
{
static TcpListener Listnerobj;
static List<Client> Online;
public static int port;
public static void BeginListening()
{
Online = new Online(50);
Listnerobj= new TcpListener(System.Net.IPAddress.Any, port);
Listnerobj.Start();
System.Threading.Thread PingerH = new System.Threading.Thread(new System.Threading.ThreadStart(PingX));
}
}
我再次创建了线程PingerH来分离主UI线程和通信过程
private static async void PingX()
{
while(_ping)
{
await PingAll();
await CheckWhoAreDisConnected();
System.Threading.Thread.Sleep(1000);
}
}
方法PingAll迭代通过所有在线列表项并发送测试包
客户端将重播“只是回显”测试数据包,LastPing字段将被更新
方法CheckWhoAreDisConnected检查客户端类中的LastPing字段
如果DateTime.Now和LastPing的减法超过200秒,则为
客户端已断开连接,因此CheckWhoAreDisConnected方法将从联机列表中删除它
我创建了两个线程,其中一个检查网络流中的数据Avaliable
如果(Listnerobj.Pending())
,另一个检查来自新客户的未决尝试
这是不正确的方式与多线程并排实现异步模式吗?
一般来说,应用逻辑是好还是坏?
我犯了错误吗?
答案 0 :(得分:1)
如果正确实现异步方法,则不需要在单独的线程中运行它。将返回类型Task
设为void
,返回异步方法吞下所有异常,通常仅为事件处理程序保留。而不是Thread.Sleep
使用await Task.Delay
。前者阻塞一个线程,后者在不阻塞线程的情况下异步等待。有关最佳做法,请参阅this article。
private static async Task PingX()
{
while(_ping)
{
await PingAll();
await CheckWhoAreDisConnected();
await Task.Delay(1000);
}
}
我还要更改BeginListening
方法以返回Task
和await PingX()
public static Task BeginListening()
{
Online = new Online(50);
Listnerobj= new TcpListener(System.Net.IPAddress.Any, port);
Listnerobj.Start();
await PingX();
}