多线程自发启动

时间:2014-10-25 04:10:41

标签: c# asp.net

我有一个非常离奇的情况。看来,当我将网页加载到浏览器时, 多个线程(至少2个)正在启动。该应用程序加载并运行正常 Windows XP盒子,但是当我尝试在我的Windows 8笔记本电脑上运行时,它似乎就是这样 不止一个启动事件正在发生并导致各种冲突。这个 Firefox和IE都在发生。

为了验证这种行为,我在一个类中放置了一个静态int,检查它是否为它 value大于零,如果是则抛出异常,然后递增int。

当然,抛出异常。

对此非常奇怪的是,没有涉及多线程/多任务处理 在我的应用程序中。

当我"触摸"网页的DLL(重建它),它正确呈现网页, 但是网页的来源("右键点击">"查看页面来源")有来源 对于未处理的异常网页,带有我的代码异常的消息 线程数大于零时抛出。

我尝试过创建一个新项目,然后将代码链接到它(Add Item ... Ad As Link), 然后建立它。它没有任何好处。

Win XP系统具有带有.NET 4.0的IIS 6,而Win 8笔记本电脑带有带有.NET 4.0的IIS 7.

语言是C#。

事实是,我对IIS几乎一无所知。

我希望比我更聪明的人(这并不是说得太多)知道什么 正在继续。

2 个答案:

答案 0 :(得分:0)

  

看来,当我将网页加载到浏览器时,多个线程(至少2个)正在启动

也许一次初始化。我怀疑每个请求都会导致额外的两个线程留在那里。

  

似乎不止一个启动事件正在发生

正常此事件将针对正在创建的HttpApplication的每个实例触发。这基本上是ASP.NET中的设计错误。他们认为汇集HttpApplication个实例并为每个请求分配其中一个实例是个好主意。每个AppDomain有一个单例最好。自己写吧。像那样:

class MyGlobalAppState { ... }
static Lazy<MyGlobalAppState> state = new Lazy<...>(StateFactory);

请注意,Lazy<T>存储任何异常并重新抛出它。这会导致您的应用在StateFactory抛出的情况下永久中断。没有池重启,它永远不会恢复。这是Lazy<T>中的设计错误。找到一种方法来解决这个问题。

  

但网页的来源(&#34;右键点击&#34;&gt;&#34;查看页面来源&#34;)包含未处理的例外网页的来源

某些浏览器会重新获取页面以查看来源。这可能很烦人或方便。

答案 1 :(得分:0)

很难说出导致此行为的原因,但正如其他人建议尝试使用Fiddler或任何其他http跟踪工具来查看发送的请求。

此外,Win XP应该运行IIS5.x而Win8应该运行IIS8。

默认情况下,IIS8 AppPool应该与集成管道一起运行,这可能会有不同的行为。我会尝试更改AppPool以使用Classic管道来查看它是否有所作为。