C# WebService应用程序-从静态/共享方法返回新对象
在webservice应用程序中使用静态/共享方法是否线程安全?此方法将被大量调用以检索新实例 例如:C# WebService应用程序-从静态/共享方法返回新对象,c#,asp.net,vb.net,web-services,C#,Asp.net,Vb.net,Web Services,在webservice应用程序中使用静态/共享方法是否线程安全?此方法将被大量调用以检索新实例 例如: 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 Func
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
发布的代码只是为了回答问题而快速打印的示例。GetAlladResces将返回另一种类型的新实例,因此它是线程安全的
我担心的是,如果同时发出多个请求,我不会返回一个带有一个请求名称和另一个请求姓氏的person实例。只有在
GetAllAddresses
是线程安全的情况下,它才是线程安全的。否则就好了
关于您的更新1,是的,这会很好。它永远不会像你描述的那样混乱。它总是创建对象的新实例,因此不同的线程不可能干扰彼此的数据。据我所知,您尝试创建一个
新人
,并将其返回到您的页面
根据该代码,线程安全实际上没有任何意义。您应该注意的是,当您要将此人保存回数据库时,必须确保线程安全,以避免多次写入
在将其写回数据库时,有两种方法可以确保安全(创建新的或进行更新)
一种是使用互斥锁,另一种是使用标准的asp.net会话来锁定页面,这将使线程安全成为整个过程。鉴于GetAllAddresses只执行读取操作,那么静态方法是完全线程安全的,因为每个重新进入的线程将创建自己的Person实例,将存储在堆栈上的引用
因此,关于更新1,因为每个线程都使用一个新的Person实例,所以两个不同的线程不可能写入同一个Person实例。这取决于GetAllAddresses的代码是什么样的?