防止在内存不足时创建线程

时间:2017-06-07 18:41:49

标签: c# multithreading memory memory-management tcp

我有一个处理TCP连接的应用程序,当建立连接时,在流上调用BeginRead以等待数据,主线程继续等待新连接。

在正常情况下,一次只有几个连接,因此通常由BeginRead创建的工作线程数不是问题。但是,在理论情况下,许多连接同时存在,最终在建立新连接时,对BeginRead的调用会导致OutOfMemoryException。我想阻止在这种情况下创建线程(或者告知更好的方法来等待来自多个流的数据)。

有什么方法可以实现这个目标?我所能想到的只是

a)一次只允许一定数量的活动连接,或

b)尝试使用名为MemoryFailPoint的东西。阅读之后,我认为这可能是更好的选择,但我怎么知道调用BeginRead需要多少内存才能安全地完成它?

2 个答案:

答案 0 :(得分:0)

看看这个帖子here。它可以为你提供很多答案。

但是你可以像这样阅读你当前的进程内存使用情况:

Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64;

答案 1 :(得分:0)

您应该使用线程池来处理这些操作,而不是为您需要执行的每个操作创建全新的线程。使用可以重用线程的线程池不仅可以大大减少创建和拆除线程所花费的时间(这并不便宜),但是线程池将确保仅在有利于线程时创建线程这样做,并且只是在添加更多线程时让请求完成工作排队并不会有益。