c# - C# UdpClient ReceiveAsync() 性能问题
问题描述
我正在对 Xamrin Forms C# 应用程序中的性能问题进行故障排除。我找到了一个可以显着提高性能的修复程序,但不完全了解根本原因。我想确定我的修复是最好的解决方案。
原始代码是这样的(我已经删除了所有用于处理收到的包的代码):
public void Start()
{
Task.Factory.StartNew(RunReceiveTask, TaskCreationOptions.LongRunning);
}
private async void RunReceiveTask()
{
while (true)
{
UdpReceiveResult result = await udpClient.ReceiveAsync();
}
}
为了在接收大量 UDP 数据包时提高性能,在 RunReceiveTask(...) 函数中进行了以下更改:
private void RunReceiveTask()
{
while (true)
{
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
var receivedBytes = m_udpClient.Receive(ref remoteEndPoint);
}
}
基本上,更改涉及使用 UdpClient.Receive(...) 而不是await UdpClient.ReceiveAsync(...)
据我所知,在这种情况下使用同步版本没有问题,但我真的很想了解为什么使用同步版本的性能要好得多!我还想知道是否还有其他方法可以在仍然使用异步版本的情况下实现相同的性能改进。
我一直试图弄清楚这一点,我最初的想法是,可能的解释是每次循环执行时都必须有很多开销调用等待......
那里有任何 C# 大师对我有任何想法或想法吗?:)
解决方案
推荐阅读
- python - 如果其中一个值相同,则 Pandas 合并 2 数据帧
- json - 为每个 REST API 响应美化或返回漂亮的 JSON 响应
- c++ - 有没有办法将整数变量数组存储到另一个数组的单个元素中?
- mongodb - 带有 OR 条件的 MongoDB Atlas 搜索过滤器范围
- javascript - 通过 array_to_json 检索的 Postgresql 数组需要转换回 Javascript 中的对象数组
- r - 将宏添加到刻面标签中的字母
- android - 为什么 View 上的 `onDraw()` 方法接收可为空的画布
- python - 如何在 Python 中使用以太坊私钥签署消息?
- flutter - 如何在 Flutter 中使用本地通知打开某个页面?(不是 FCM)
- c++ - 如何为模板实例使用容器