首页 > 解决方案 > 什么控制 C# 中未等待的异步任务的数量?

问题描述

编写一个处理方法,从队列中取出一个项目,处理它,下一个项目,等等。

它不够快,因为有时处理必须等待网络 I/O。

同时,它是await ProcessThisMessage(message)

如果我将其更改为ProcessThisMessage(message)(即async Task) 而不是 (fire & forget),如果很多这些堆叠在一起,会有什么行为?

是不是受机器内存和CPU的限制?或者是否存在诸如最大线程池大小之类的硬限制?

基本上,我想知道 C# 是否会在达到最大值时通过自然限制和阻塞来照顾自己,或者我是否需要手动执行某些操作以防它们累积并达到极限。

标签: c#multithreadingasync-await

解决方案


速度不够快

正常的解决方案是添加另一个处理器实例。可能在另一台机器上,也可能在同一台机器上。我使用过一些多线程处理器,每个线程独立地从队列中取出;而且我使用过一些可以扩展到多台机器的处理器。

“一劳永逸”不是一个正常的解决方案,因为“一劳永逸”的意思是“我不在乎这是否失败”,通常你关心它是否失败。

那说:

是不是受机器内存和CPU的限制?或者是否存在诸如最大线程池大小之类的硬限制?

异步任务仅受内存限制。每个“触发并忘记”任务将一直存在,直到它完成(或者直到应用程序退出,当然)。.NET 没有内置任何限制。您的应用程序将耗尽内存。


推荐阅读