2013-11-26 21 views
1

我有一个内部调用Html.Action(“action”,“controller”)的Html帮助器方法。我担心这种辅助方法是否线程安全,或者如果用户数量上升到10 K,它有可能会弄乱输出。Html Helper方法是线程安全的吗?

注意:对不起有一个问题,当我发布这个问题让代码被留下。

public static MvcHtmlString FormHelper(this HtmlHelper html, string id, TemplateField field, string retunUrl = "") 
     { 
      var fieldid = (new KeyValuePair<string, string>("template-field-id", field.Id)); 
      var editid = (new KeyValuePair<string, string>("data-edit-id", field.TemplateId.ToString())); 
      var name = 
       field.AttributesLists.FirstOrDefault(x => x.Name.Equals("name", StringComparison.InvariantCultureIgnoreCase)); 
      var url = 
       field.AttributesLists.FirstOrDefault(
        x => x.Name.Equals("returnurl", StringComparison.InvariantCultureIgnoreCase)); 
      if (url != null && !string.IsNullOrWhiteSpace(url.Value)) 
      { 
       // save return url in session 
       retunUrl = url.Value; 
      } 
      return name == null ? new MvcHtmlString(string.Empty) : html.Action("WidgetsByZone", "Widget", new { widgetZone = name.Value, url = retunUrl }); 
     } 
+0

不,这不会弄乱任何东西。 –

+1

你很安全。此外,它只在工作者线程中被调用;这不像你在同一个环境中生成多个页面。 –

+1

'我有一个内部调用Html.Action'的Html帮助器方法您可以发布该方法吗?因为*方法是线程安全的并不意味着使用它的代码将是线程安全的。是你的方法还是我把你错了? –

回答

1

Microsoft记录了他们发布的大多数类的线程安全性。

下面的类都列出了注意事项:

任何公共静态在Visual Basic中的Shared)这种类型的成员是线程安全的。任何实例成员不保证是线程安全的。

+0

这有什么关系?正如我在对Jon(现已删除的)答案的评论中所说的,所讨论的方法不是这些类型中的任何一个的成员。它是'ChildActionExtensions'的成员。我想,关于ChildActionExtensions的线程安全说明并没有提及其参数。 – svick

+0

@svick确实如此。如果'ChildActionExtensions'只在'HtmlHelper'上调用静态方法,为什么它需要'HtmlHelper'实例作为参数?唯一安全的假设是如果实例方法不一定是线程安全的,那么这种类型的扩展方法也不是。 –

+0

所以,你说'Action()'是*不是*线程安全的?因为你的回答我不清楚。 – svick

0

不,它不是线程安全的。

HtmlHelper有一些实例属性,特别是ViewContext和ViewData(通过ViewDataContainer)等等。把它放在任何地方都是静态的,这是一个糟糕的可怕想法。

+0

这些属性的无保证线程安全与'Action'有什么关系? – Jon

+1

线程安全性与操作的实现直接相关。该文档声明它们是线程安全的。具有实例属性并不意味着它们不是线程安全的。这些实例属性可以在修改过程中正确锁定。 –