如何编写正确的静态方法 - 多线程安全

时间:2010-01-02 19:02:17

标签: c# .net multithreading static extension-methods

我认为静态方法不应该像第一个片段那样写,否则我错了?

public static class ExtensionClass
{
 private static SomeClass object1;
 private static StringBuilder sb;

 private static string DoSomething()
 {
    sb.AppendLine(object1.SomeValue);
 }

 public static string ExtensionMethod(this HtmlHelper helper, SomeClass _object1)
 {
    object1 = _object1;
    sb = new StringBuilder();

    DoSomething();

    return sb.ToString();
 }
}

所以我想出了这个:

public static class ExtensionClass
{
  private static string DoSomething(ref StringBuilder _sb,SomeClass object1)
  {
    _sb.AppendLine(object1.SomeValue);
  }

  public static string ExtensionMethod(this HtmlHelper helper, SomeClass _object1)
  {
    SomeClass object1 = _object1;
    StringBuilder sb = new StringBuilder();

    DoSomething(ref sb,_object1);

    return sb.ToString();
  }

}

最后一段多线程是否安全?这应该是一种扩展方法,因此它不能是非静态的。或者是否有更好的方法在静态方法中传递非静态对象?

1 个答案:

答案 0 :(得分:8)

第二个片段与您传入其中的对象一样多线程安全。如果在ExtensionMethod运行时某些其他方法使用HtmlHelper或SomeClass,那么您可能遇到问题。但是ExtensionMethod获得了自己的StringBuilder(与你的第一个代码片段不同),因此对ExtensionMethod的多次调用将获得不同的StringBuilders,并且所有这些都将在这方面做得很好。

你是正确的,不应该像第一个片段那样编写静态方法。正如您所知,如果线程A调用ExtensionMethod,并且线程B调用ExtensionMethod而线程A仍在那里,则sb成员将被更改为引用新的StringBuilder。 A到目前为止所做的所有工作都将丢失,A和B将从此添加到相同的StringBuilder中,并产生不良结果!