我有一些.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表明这种方法可行,但对一般系统具有性能影响。
如果是这样,你会如何建议处理大量的请求超时/ s - 爆破时大概是1000次/秒?
在Python中,我以前使用类似龙卷风的IOLoop来确保内核/ ThreadPool上没有这么重。
答案 0 :(得分:0)
首先,向线程池添加任务并不一定会导致新线程被添加到线程池。向线程池添加新任务时,会将其添加到内部队列。来自线程池的现有线程逐个从该队列中获取任务并执行它们。线程池将启动新线程或在其认为合适时停止它们。
使用阻塞逻辑添加任务将导致线程池中的线程阻塞。这意味着他们无法从队列中执行其他任务,这将导致性能问题。
为某些操作添加延迟的一种方法是使用内部使用计时器的Task.Delay方法。
Task.Delay(delay).ContinueWith(action);
这不会阻止线程池中的任何线程。在指定的延迟后,action
将被添加到线程池并执行。
您也可以直接使用计时器。
正如有人在评论中建议的那样,您也可以使用异步方法。我相信以下代码将等同于您的样本。
public async Task ExecuteActionAfterDelay()
{
await Task.Delay(3000);
action();
}
您可能还想查看此问题Asynchronously wait for Task<T> to complete with timeout。