如何更改代码以异步接收消息? 该应用程序是用 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;
}
}`
如果你想创建一个异步等待方法,你必须执行以下操作:
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.