asp.net - 关于在IIS 7托管的ASP.Net应用程序中使用线程以避免堆栈溢出异常的意见和建议

标签 asp.net multithreading iis stack-overflow thread-safety

在ASP.Net Web应用程序中,如果要运行堆栈密集型操作,则当堆栈大小超过IIS设置的256K限制时,IIS上将引发stackoverflow异常。但是,常规的winform应用程序的限制为1MB。因此,在Winform应用程序中运行相同的操作时,不会发生该异常。

这里没有递归或任何其他代码特定的问题。

有多种方法可以解决此问题,例如在w3wp.exe上使用EditBin,但不支持。

另一种选择是修改实际代码,以减少本地变量的大小,并减少堆栈大小,这可能会涉及大量的设计和代码更改。

但是以下方法解决了在单独的线程上运行堆栈密集型操作时显式指定1MB大小的问题。

Thread thread = new Thread(() =>
{
    RunStackIntensiveOperation(someObject);
}, 1048576);
thread.Start();
thread.Join();

我将采用这种第三种方法。但是,我很想知道其他人是否有类似的情况并且由于“在单独线程上操作”方法而遇到了问题。

如果我运行单独的线程,可能会发生什么问题?有什么要注意的事情?

意见,建议请...

最佳答案

有一种方法可以将堆栈大小更改回1 MiB或更大。您可以使用EDITBIT命令。这是要做的信息how

另一方面,从部署的角度来看,修改IIS二进制文件w3wp.exe看起来并不好。

带额外线程的警告与性能有关。额外的线程将消耗1 MiB的内存。如果对您的Web应用程序有很多请求,您可能会很快耗尽内存。

为了减少内存使用,您可以使用堆栈大小正确的线程创建自定义线程池。

关于asp.net - 关于在IIS 7托管的ASP.Net应用程序中使用线程以避免堆栈溢出异常的意见和建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3577599/

相关文章:

c# - 如何缩小aspx页面

c# - 隐藏 BoundField 但仍然能够使用 C# 获取值

asp.net - 使用 jQuery 将 ASP.NET 控件添加到页面

java - 我们如何在Java中调用多线程?

类中的 Python 线程

c# - 在 WCF 或 WebAPI 方法 (IIS) 中返回 "Task<int>"而不是 "int"的好处

c# - 在反向代理后面部署 IdentityServer4

asp.net - 什么是中等信任级别?

c - 在 C++ 中并行化素数生成器

asp.net - 在被 WCF 类解析之前,如何在 IIS 中即时修改不正确的 XML header (编码)?