gpt4 book ai didi

c# - .NET Task Performance with 1000s of blocked Tasks

转载 作者:行者123 更新时间:2023-11-30 21:46:49 25 4
gpt4 key购买 nike

我有一些 .NET4 代码需要知道网络请求是否/何时超时。

下面的代码是否会在每次任务运行时将一个新的Thread 添加到.NET ThreadPool 中,然后在它退出时释放它?

var wait = new Task(() =>
{
using (var pauseEvent = new ManualResetEvent(false))
pauseEvent.WaitOne(TimeSpan.FromMilliseconds(delay));
}).ContinueWith(action);
wait.Start()

https://stackoverflow.com/a/15096427/464603表明这种方法可行,但对一般系统有性能影响。

如果是这样,您建议如何处理大量请求超时/秒 - 突发时可能为 1000 次/秒?

在 Python 中,我之前使用过类似 Tornado IOLoop 的东西来确保这不会对内核/线程池造成沉重负担。

最佳答案

I have some .NET4 code that needs to know if/when a network request times out.

最简单的方法是在 API 级别使用超时,例如 WebRequest.TimeoutCancellationTokenSource.CancelAfter。这样,当超时发生时,操作本身实际上会因错误而停止。这是超时的正确方法。

定时等待是完全不同的。 (您的代码会进行定时等待)。对于定时等待,只有等待超时;该操作仍在继续,消耗系统资源,并且不知道它应该停止。

如果您必须WaitHandle 进行定时等待,例如 ManualResetEvent,那么您可以使用 ThreadPool.RegisterWaitForSingleObject ,它允许线程池线程一次等待 31 个对象,而不是一个。但是,我认为这是最后一搏的极端解决方案,仅当代码无法修改为使用适当的超时时才可接受。

附言Microsoft.Bcl.Async添加对 .NET 4 的 async/await 支持。

附言永远不要在未明确指定调度程序的情况下使用 StartNewContinueWith。正如我在我的博客上描述的那样,it's dangerous .

关于c# - .NET Task Performance with 1000s of blocked Tasks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38973580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com