这是实现异步方法的不正确方法吗?

时间:2014-12-31 00:23:23

标签: c# multithreading sockets asynchronous

我在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())
,另一个检查来自新客户的未决尝试 这是不正确的方式与多线程并排实现异步模式吗? 一般来说,应用逻辑是好还是坏? 我犯了错误吗?

1 个答案:

答案 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方法以返回Taskawait PingX()

public static Task BeginListening()
{
   Online = new Online(50);
   Listnerobj= new TcpListener(System.Net.IPAddress.Any, port);
   Listnerobj.Start();
   await PingX();
 }