0

我正在实现一个自定义 IControllerFactory 来创建我的 asp.net mvc 控制器。在这个工厂的 CreateController 方法中,我依赖于创建控制器的线程是唯一的这一事实;这意味着在调用 ReleaseController 之前没有在该线程上创建其他控制器。

现在,在重负载测试下,我遇到了问题。假设我在线程 1、2、3 上创建了控制器,似乎在线程 1 上创建了一个新的控制器,在第一个控制器调用 IControllerFactory.ReleaseController 之前。

这是预期的行为吗?对控制器的每个请求都在单独的线程上处理,对吗?在调用 IControllerFactory 的 ReleaseController 方法之前,如何将同一个线程重用于不同的请求?

谢谢你的时间,科恩

4

1 回答 1

2

在这个工厂的 CreateController 方法中,我依赖于创建控制器的线程是唯一的这一事实;这意味着在调用 ReleaseController 之前没有在该线程上创建其他控制器。

你绝对不能依赖这种行为。没有什么可以保证你。如果您使用异步控制器,情况可能会变得更糟。

这是预期的行为吗?

是的。

对控制器的每个请求都在单独的线程上处理,对吗?

不。

在调用 IControllerFactory 的 ReleaseController 方法之前,如何将同一个线程重用于不同的请求?

ASP.NET 使用线程池来处理请求。例如,从这个池中抽取一个线程来服务请求,然后这个线程返回到池中以供重用。所以你完全可以让同一个线程为两个完全独立的请求执行控制器代码。

您绝对不应该在 ASP.NET 应用程序中依赖线程。如果你想存储一些每个请求的特定信息,你应该使用 HttpContext 存储,而不是线程。如果您想要安全,请忘记 ASP.NET 应用程序中的线程。

于 2013-01-13T10:36:01.750 回答