这个方法线程安全吗?

时间:2011-04-18 10:52:38

标签: asp.net-mvc-2 static thread-safety unity-container

我正在使用MVC2框架和Unity2作为IOC容器。我使用Unity解决了IHttpContextLocatorService实例,如下所示。

  RootContainer.RegisterType<IHttpContextLocatorService, HttpContextLocatorService>(new ContainerControlledLifetimeManager());

上面给出了HttpContextLocatorService的“单例”。

GetCurrentContext()函数已被我们的应用程序中的许多地方调用。我担心GetCurrentContext()不是线程安全。测试这个并不容易,因为我无法重新创建由各种RequestContext和Controller等组成的多个线程。

有人可以建议方法“GetCurrentContext()”是否是线程安全的?

public class HttpContextLocatorService : IHttpContextLocatorService
{

    [Dependency]
    public IControllerLocatorService ControllerLocator { get; set; }


    [Dependency]
    public IRequestContextLocatorService RequestContextLocator { get; set; }

    public HttpContextBase GetCurrentContext()
    {
        Controller controller = null;

        try
        {
            controller = this.ControllerLocator.GetController(this.RequestContextLocator.GetCurrentRequestContext()) as Controller;
        }
        catch { }

        if (controller == null)
        {
            return new HttpContextWrapper(HttpContext.Current);
        }

        return controller.HttpContext;
    }
}

1 个答案:

答案 0 :(得分:1)

IControllerLocatorService.GetController()RequestContextLocator.GetCurrentRequestContext()的两种实现都是线程安全的。

如果他们是有状态的(他们的方法因此而言)可能不是线程安全的。 IMO你有两个选择:

  • 确保这两种方法都是线程安全的
  • 使GetCurrentContext方法对两个依赖项进行线程安全锁定访问