|
1
78
你可以使用
|
|
|
2
66
在这种情况下,SemaphoreSlim是一个非常好的解决方案,我强烈建议OP尝试一下,但@Manoj的回答有评论中提到的缺陷。在生成这样的任务之前,应该等待semaphore。
更新的答案:
正如@Vasyl所指出的,信号量可能在任务完成前被处理,并在
对意见的答复
对于那些想了解如何在没有
|
|
|
3
11
我认为最好使用并行LINQ
其中x是最大并行度 |
|
|
4
7
具有
.NET 5.0
和
核心3.0
channels
介绍。
队列容量为50条消息和5个使用者线程的代码示例:
正如所指出的 Theodor Zoulias : 对于多个使用者异常,剩余的任务将继续运行,并且必须承担终止任务的负载。为了避免这种情况,我实现了一个CancellationToken来停止所有剩余的任务,并处理 聚合异常 属于 等待消费者。异常 。
旁注:
|
|
|
5
2
如果你
在这种情况下,正确的方法是使用
|
|
|
6
0
您可以创建自己的TaskScheduler并在那里覆盖QueueTask。
然后你可以做任何你喜欢的事。 这里有一个例子: Limited concurrency level task scheduler (with task priority) handling wrapped tasks |
|
|
7
0
您可以这样简单地设置最大并发度:
|
|
|
8
0
如果您需要按顺序排队(处理可能以任何顺序完成),则不需要信号量。老式的if语句运行良好:
|
|
|
9
0
我遇到了一个类似的问题,我想在调用api等时产生5000个结果。因此,我进行了一些速度测试。
在30秒内产生了100个结果。
将GetAwaiter().GetResult()移动到GetProductMetaData内部的各个异步api调用,结果是在14.09秒内生成100个结果。
使用GetAwaiter()完成非异步编程。api调用中的GetResult()只需13.417秒。
形成一份任务清单,一次完成100个任务,结果速度为7.36秒。
使用SemaphoreSlim只需13.369秒,但也需要一段时间才能启动使用。
将Semaphore Slim与节流器一起用于我的异步任务花费了6.12秒。 在这个特定的项目中,我的答案是使用Semaphore Slim的节流器。尽管while foreach任务列表有时确实击败了throttler,但throttler有4/6次赢得了1000条记录。 我意识到我没有使用OP代码,但我认为这很重要,并增加了这一讨论,因为如何有时不是唯一应该问的问题,答案有时是“这取决于你试图做什么。” 现在回答具体问题:
|
|
|
10
-1
|
|
|
11
-1
你可以使用
请注意
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |