WebService成员变量和线程安全

时间:2010-02-13 13:57:02

标签: .net web-services multithreading

我担心这很明显,但有人会介意确认WebServices的私有字段是线程安全的吗?具体地,

1)在下面的代码中,每个线程都将获得ReportService类的新实例

protected void Page_Load(object sender, EventArgs e)
{
    // Client side scripting
    ScriptManager scriptManager = ScriptManager.GetCurrent(this);
    scriptManager.Services.Add(new ServiceReference("~/WebServices/ReportService.asmx"));
}

2)由于(1),“ReportService”中的每个WebMethod都可以安全地操作和引用私有字段,如下所示:

[System.Web.Script.Services.ScriptService]
public class ReportService : : System.Web.Services.WebService
{
  private string _protocol = null;
  private string _reportType = null;

  [WebMethod]
  public string GetReport(string protocol, string reportType, string reportId)
  {
    _protocol = protocol;
    _reportType = reportType;
    return GetCustomReport(reportId);
  }
}

为了说明的目的,上面的方法是愚蠢的。 MSDN上有一个使用私有字段的示例,但私有字段_xmlStr未被操作,导致线程安全问题模糊不清。

http://msdn.microsoft.com/en-us/library/bb398995.aspx

谢谢,

- 布雷特

1 个答案:

答案 0 :(得分:1)

是的,这是线程安全的,但我建议您避免在Web服务中使用私有字段。只需将protocolreportType参数添加到GetCustomReport方法即可。这样您就不再需要这些字段了。