对于一个控制器而不是另一个控制器,新线程的创建静默失败? C# ASP.NET (IIS 8.5) 网络 API 2
New thread creation silently fails for one controller and not the other? C# ASP.NET (IIS 8.5) Web API 2
我在 Web API 2 项目中设置了两个控制器。第一个控制器通过调用另一个控制器启动 n 个处理会话。
伪代码中的第一个控制器:
[HttpPost]
public bool Post(...)
{
...
StartProcessingSessions(howMany)
}
void StartProcessingSessions(...)
{
for (i=1 to HowMany)
Task.Factory.StartNew(() => StartProcessingSession(...);
}
void StartProcessingSession(...)
{
[post async to 2nd controller]
}
这段代码工作正常,第二个控制器被调用。第二个控制器尝试以完全相同的方式创建一个线程来执行一些可能很长的 运行 工作(1-10 分钟),但该线程无法启动,静默。在网上搜索之后,我读到了有关支持在 IIS 中创建线程的相互矛盾的信息。大多数人说在 4.5.2 之后应该没问题,但其他人说它一直有效。公司原因,暂时不能超过4.5.1
最重要的是,代码在调试模式下工作正常,只有在部署到网络服务器时才会失败。
我试过用简单的数据库日志写入替换处理,但它没有执行。其他创建线程的方法也会悄无声息地失败。如果我删除第二个控制器中的线程创建,一切正常。
接下来,我计划尝试简化控制器,看看我是否可以查明阻塞线程的标准究竟是什么。
有什么见解吗?谢谢
编辑:这是一个简单的控制器,可以代替 "Controller 2" 来说明问题。第一个日志写了,第二个没有。
[HttpPost]
public bool Post()
{
_logRepository.InsertError("Modeling Debugging", "TestController hit");
Task.Factory.StartNew(() => _logRepository.InsertError("Modeling Debugging", "TestController Thread"));
return true;
}
这似乎只是 ASP.NET 的 "safety" 限制,可能是为了防止开发人员通过请求拆分膨胀失控而搬起石头砸自己的脚。我还没有找到任何信息来证实这一点,但这是我目前唯一合理的解释。
如果您可以使用 .NET 4.5.2+,这可能是一个有争议的问题,因为您拥有可能不受此限制的 BackgroundWorker。我在上面的用例中没有被阻塞,因为我仍然能够获得我想要的线程,尽管我直接将它们 运行 作为控制器线程。不是我想要的,但它可以让我充分利用 CPU。
我在 Web API 2 项目中设置了两个控制器。第一个控制器通过调用另一个控制器启动 n 个处理会话。
伪代码中的第一个控制器:
[HttpPost]
public bool Post(...)
{
...
StartProcessingSessions(howMany)
}
void StartProcessingSessions(...)
{
for (i=1 to HowMany)
Task.Factory.StartNew(() => StartProcessingSession(...);
}
void StartProcessingSession(...)
{
[post async to 2nd controller]
}
这段代码工作正常,第二个控制器被调用。第二个控制器尝试以完全相同的方式创建一个线程来执行一些可能很长的 运行 工作(1-10 分钟),但该线程无法启动,静默。在网上搜索之后,我读到了有关支持在 IIS 中创建线程的相互矛盾的信息。大多数人说在 4.5.2 之后应该没问题,但其他人说它一直有效。公司原因,暂时不能超过4.5.1
最重要的是,代码在调试模式下工作正常,只有在部署到网络服务器时才会失败。
我试过用简单的数据库日志写入替换处理,但它没有执行。其他创建线程的方法也会悄无声息地失败。如果我删除第二个控制器中的线程创建,一切正常。
接下来,我计划尝试简化控制器,看看我是否可以查明阻塞线程的标准究竟是什么。
有什么见解吗?谢谢
编辑:这是一个简单的控制器,可以代替 "Controller 2" 来说明问题。第一个日志写了,第二个没有。
[HttpPost]
public bool Post()
{
_logRepository.InsertError("Modeling Debugging", "TestController hit");
Task.Factory.StartNew(() => _logRepository.InsertError("Modeling Debugging", "TestController Thread"));
return true;
}
这似乎只是 ASP.NET 的 "safety" 限制,可能是为了防止开发人员通过请求拆分膨胀失控而搬起石头砸自己的脚。我还没有找到任何信息来证实这一点,但这是我目前唯一合理的解释。
如果您可以使用 .NET 4.5.2+,这可能是一个有争议的问题,因为您拥有可能不受此限制的 BackgroundWorker。我在上面的用例中没有被阻塞,因为我仍然能够获得我想要的线程,尽管我直接将它们 运行 作为控制器线程。不是我想要的,但它可以让我充分利用 CPU。