如何异步接收消息?

问题描述 投票:0回答:1

如何更改代码以异步接收消息? 该应用程序是用 C# WinForms 编写的

我的应用程序异步发送消息,不同步接收。我应该改变什么才能异步接收? `

  private void ReceiveUDPMessage()
   {
       while (true)
       {
           try
           {
               Int32 port = Int32.Parse(LocalPortTextBox.Text);
               IPAddress ip = IPAddress.Parse(LocalIPTextBox.Text.Trim());
               IPEndPoint remoteIPEndPoint = new IPEndPoint(ip, port);
               byte[] content = udpClient.Receive(ref remoteIPEndPoint);
               if (content.Length > 0)
               {
                   string message = Encoding.ASCII.GetString(content);

                   // Обработка полученных сообщений и обновление состояния робота
                   HandleReceivedMessage(message);
               }
           }
           catch
           {
               string errmessage = "RemoteHost lost";
               this.Invoke(myDelegate, new object[] { errmessage });
           }
       }
   }

   private void HandleReceivedMessage(string message)
   {
       switch (message)
       {
           case "MoveToSector1":
               UpdateRobotState(RobotState.MovingToSector1);
               break;
       }
   }`
c# winforms udp udpclient windowsformshost
1个回答
0
投票

如果你想创建一个异步等待方法,你必须执行以下操作:

  • 声明它是异步的
  • 更改返回类型。返回
    Task
    而不是
    void
    ;返回
    Task<TResult>
    而不是
    TResult
    。唯一的例外是事件处理程序。即使它们被声明为异步,它们也会返回 void。
  • 在您的方法中使用所有可用的异步方法。因此,如果您要从数据库查询、从互联网获取数据并将结果写入磁盘,请使用所有三种异步方法。
  • 返回之前,请确保您已等待所有异步调用。
  • await Task<TResult>
    的返回值为
    TResult

习惯上将 Async 添加到方法名称中。这样你就可以同时拥有同步和异步方法:

File.Write
File.WriteAsync

到目前为止,您一直在使用

public byte[] Receive (ref System.Net.IPEndPoint? remoteEP);

但是异步方法没有包含 IpEndPoint 的参数

public Task<System.Net.Sockets.UdpReceiveResult> ReceiveAsync ();

接收到的数据和RemoteEndPoint在UpdReceiveResult中。所以等待之后你必须去取它们。

私有异步任务 ReceiveUDPMessageAsync() { 而(真) { 尝试 { // 调用异步方法之前做一些准备工作 Int32 端口 = Int32.Parse(LocalPortTextBox.Text); IPAddress ip = IPAddress.Parse(LocalIPTextBox.Text.Trim()); IPEndPoint RemoteIPEndPoint = new IPEndPoint(ip, 端口); udpClient.Connect(ipEndPoint);

           // call the async method.
           // To show what happens I write it with intermediate steps
           Task<UdpReceiveResult> taskReceive = udpClient.ReceiveAsync();

           // Because I didn't await yet, if needed I could do something else
           // while the udpClient is receiving, for example:
           DoSomethingElse();

           // Now you can't continue without the result of the async Receive
           // action,await for it:
           UdpReceiveResult receiveResult = await taskReceive;

           remoteIPEndPoint = receiveResult.RemoteEndPoint;
           byte[] content = receiveResult.Buffer;

           if (content.Length > 0)
           {
               string message = Encoding.ASCII.GetString(content);

               // Обработка полученных сообщений и обновление состояния робота
               HandleReceivedMessage(message);
           }
       }
       catch
       {
           string errmessage = "RemoteHost lost";
           this.Invoke(myDelegate, new object[] { errmessage });
       }
   }

}

当然,如果你除了等待之外没什么可做的,你可以结合这些语句:

UdpReceiveResult receiveResult = await udpClient.ReceiveAsync();
byte[] content = receiveResult.Buffer;
etc.
© www.soinside.com 2019 - 2024. All rights reserved.