【问题标题】:WebService application - return new objects from static/shared methodWebService 应用程序 - 从静态/共享方法返回新对象
【发布时间】:2012-10-02 14:28:56
【问题描述】:

会在 web 服务应用程序线程安全中使用静态/共享方法吗?会大量调用此方法来检索新实例。

例如:

 Public Shared GetPerson(ByVal name as String,ByVal surname) as Person
    Dim p As New Person
    p.Name = name
    p.Surname = surname
    p.Addresses = GetAllAddresses(name)
    return p
End Function  

更新 1

发布的代码只是用于问题目的的快速输入示例。 GetAllAdrresses 将返回另一种类型的新实例,因此它是线程安全的。

我担心的是,如果同时发出许多请求,我不会返回一个包含一个请求的名称和另一个请求的姓氏的人员实例。

【问题讨论】:

  • 这取决于,GetAllAddresses 的代码是什么样的?

标签: c# asp.net vb.net web-services


【解决方案1】:

只有GetAllAddresses 是线程安全的,它才会是线程安全的。否则没关系。

关于您的 UPDATE 1,是的,可以正常工作。它永远不会像您描述的那样感到困惑。它总是在创建新的对象实例,因此各个线程之间不会相互干扰数据。

【讨论】:

    【解决方案2】:

    鉴于 GetAllAddresses 仅执行读取操作,因此静态方法是完全线程安全的,因为每个重新进入的线程都会创建自己的 Person 实例,对它的引用将存储在堆栈中。

    所以,关于 UPDATE 1,因为每个线程都在使用一个新的 Person 实例,所以两个不同的线程不可能写入同一个 person 实例。

    【讨论】:

      【解决方案3】:

      据我了解,您尝试创建 new Person 并将其返回到您的页面。

      通过该代码,线程安全没有实际意义。您应该看到的是,当您将该人保存回数据库时,您必须确保它是线程安全的,以避免多次写入。

      当你将它写回数据库时,有两种方法可以确保它的安全(新建或更新)

      一是使用互斥锁,二是使用标准的asp.net会话,即锁定页面,这将使整个进程的线程安全。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多