具有1000个被阻止任务的.NET任务性能

时间:2016-08-16 11:21:48

标签: c# .net multithreading

我有一些.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上没有这么重。

1 个答案:

答案 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