我正在阅读azure表的数据 - 大约5k表并收集不同的指标并将它们以异步方式保存回其他一些azure表。我面临的问题是,当有大量数据可能偶尔发生时,应用程序开始挂起。相同的代码工作正常,数据较少。我正在做的步骤(所有这些步骤都使用Rx,async和await进行异步)是
Task.WhenAll
)Task.WhenAll
)我想要的是,使用asynchronousy直到它不会使我的应用程序挂起。如果数据多于可处理的数据,则不应再读取表的数据,而应专注于完成可用的数据处理。
Parallel.ForEach
会照顾到吗?
代码:根据Stephen Cleary 进行编辑,仍然不适用于所有表格。而它适用于500张桌子,
我认为是将应用程序(控制台应用程序)置于停顿状态而不是线程数量的数据量。 (一个线程最终可能会检索数百万行,数千个,每千个传递给一个方法,并且它的计数被添加到字典中,因此当需要更多内存时可以进行垃圾收集)或者是我实现的方式{ {1}}这是错的?
Semaphoreslim
答案 0 :(得分:3)
由于您的async
正在包装Rx,我建议您在async
级别进行限制。您可以通过定义SemaphoreSlim
并将方法逻辑包装在WaitAsync
/ Release
中来实现此目的。
或者,考虑TPL Dataflow。 Dataflow具有用于限制的内置选项(MaxDegreeOfParallelism
),并且还可以与async
和Rx自然地互操作。