c# - 什么控制 C# 中未等待的异步任务的数量?
问题描述
编写一个处理方法,从队列中取出一个项目,处理它,下一个项目,等等。
它不够快,因为有时处理必须等待网络 I/O。
同时,它是await ProcessThisMessage(message)
。
如果我将其更改为ProcessThisMessage(message)
(即async Task
) 而不是 (fire & forget),如果很多这些堆叠在一起,会有什么行为?
是不是受机器内存和CPU的限制?或者是否存在诸如最大线程池大小之类的硬限制?
基本上,我想知道 C# 是否会在达到最大值时通过自然限制和阻塞来照顾自己,或者我是否需要手动执行某些操作以防它们累积并达到极限。
解决方案
速度不够快
正常的解决方案是添加另一个处理器实例。可能在另一台机器上,也可能在同一台机器上。我使用过一些多线程处理器,每个线程独立地从队列中取出;而且我使用过一些可以扩展到多台机器的处理器。
“一劳永逸”不是一个正常的解决方案,因为“一劳永逸”的意思是“我不在乎这是否失败”,通常你会关心它是否失败。
那说:
是不是受机器内存和CPU的限制?或者是否存在诸如最大线程池大小之类的硬限制?
异步任务仅受内存限制。每个“触发并忘记”任务将一直存在,直到它完成(或者直到应用程序退出,当然)。.NET 没有内置任何限制。您的应用程序将耗尽内存。
推荐阅读
- python - 使用 Python SDK 的 Azure 数据工厂 HTTP 数据集,找不到参数
- c++ - STM32 和 HAL 函数 GetTick()
- javascript - document.querySelector 没有选择元素并抛出 ReferenceError: document is not defined
- java - 如何测试不返回任何内容的方法?
- bash - crontab:macos 中的“找不到 ftp 命令”错误
- java - 无法使用 super.paintComponent(g) 使 JPanel 在 JFrame 中显示。Java中的空JFrame
- powerbi - DAX 公式用于计算特定区域中的所有不同客户
- r - 使用 lapply 等技术单独配对值
- c++ - 为什么要调用构造函数?
- html - 如何抓取包含图像的表格标题?