C# 在 UdpClient 接收上使用 async/await
C# Use async/await on UdpClient Receive
以下代码使用Task进行异步接收,并在控制台显示接收结果:
private void ReceiveMessage()
{
Task.Run(async() =>
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
});
}
我想学习如何使用 async/await 函数,所以我想知道 如何使用 async/await 异步创建函数 ReceiveMessage()?
只需将另一个 async/await 添加到您的函数中:
private async void receiveMessage()
{
await Task.Run(async() =>
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
});
}
如果你想写一个可等待的方法,return一个任务:
private Task foo(){
Task doStuff = new Task(() => {});
doStuff.Start();
return doStuff;
};
//Another method
private async void bar()
{
await foo();
}
更新:
如下所述,您实际上不需要在线程池内的线程上执行该任务。这没有错,但没用。为了更好的使用,您可以使用:
private async void receiveMessage()
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
}
如果您希望整个方法都可以等待,只需将其更改为:
private async Task ReceiveMessage()
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
}
您不再需要 Task.Run()
,它将使用线程。不需要那个线程。该方法现在 returns 给调用者,同时 await
ing ReceiveAsync()
.
当 ReceiveAsync()
完成时,该方法(最终)在 Console.WriteLine()
.
恢复
如果您希望它是即发即弃的,并且在单独的线程上侦听,那么您拥有的代码是有效的。如果你不想要这个,我会删除 Task.Run
并确保在你的方法中 return 一个 Task
,像这样:
private async Task ReceiveMessage()
{
using (var udpClient = new UdpClient(15000))
{
while (true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
}
以下代码使用Task进行异步接收,并在控制台显示接收结果:
private void ReceiveMessage()
{
Task.Run(async() =>
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
});
}
我想学习如何使用 async/await 函数,所以我想知道 如何使用 async/await 异步创建函数 ReceiveMessage()?
只需将另一个 async/await 添加到您的函数中:
private async void receiveMessage()
{
await Task.Run(async() =>
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
});
}
如果你想写一个可等待的方法,return一个任务:
private Task foo(){
Task doStuff = new Task(() => {});
doStuff.Start();
return doStuff;
};
//Another method
private async void bar()
{
await foo();
}
更新: 如下所述,您实际上不需要在线程池内的线程上执行该任务。这没有错,但没用。为了更好的使用,您可以使用:
private async void receiveMessage()
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
}
如果您希望整个方法都可以等待,只需将其更改为:
private async Task ReceiveMessage()
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
}
您不再需要 Task.Run()
,它将使用线程。不需要那个线程。该方法现在 returns 给调用者,同时 await
ing ReceiveAsync()
.
当 ReceiveAsync()
完成时,该方法(最终)在 Console.WriteLine()
.
如果您希望它是即发即弃的,并且在单独的线程上侦听,那么您拥有的代码是有效的。如果你不想要这个,我会删除 Task.Run
并确保在你的方法中 return 一个 Task
,像这样:
private async Task ReceiveMessage()
{
using (var udpClient = new UdpClient(15000))
{
while (true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
}