我使用VS 2008(c#)的“添加Web引用”功能创建了一个Web服务代理。
生成的类派生自SoapHttpClientProtocol
我可以只将一个代理实例存储在一个单例中吗?它是线程安全的吗?呼叫之间是否存在阻止我这样做的状态?
答案 0 :(得分:10)
MSDN说SoapHttpClientProtocol是线程安全的:
线程安全
此类型是线程安全的。
对于像System.Windows.Forms这样不是线程安全的另一个类,MSDN说,
线程安全
此类型的任何公共静态(在Visual Basic中为Shared)成员都是 线程安全。任何实例成员都不能保证是线程 安全
Here is a Microsoft/MSDN employee说(虽然没有保证)它是线程安全的:
Hi Max,
对于webservice代理,我认为它应该是.NET的线程安全 生成的代理类派生自“SoapHttpClientProtocol” 在文档中标记为线程安全的类:
SoapHttpClientProtocol Class
因此,在多线程上下文中使用它应该是安全的 因为您没有手动添加任何上下文相关的成员 派生代理类。你这么认为吗?
此致
Steven Cheng
Microsoft MSDN在线支持主管
此帖子按“原样”提供,不提供任何保证,并且不提供保证 权利。
答案 1 :(得分:2)
没有。它不是线程安全的。客户端必须处于“打开”状态才能启用呼叫。一个简单的场景,其中一个线程执行client.Close()而另一个线程尝试调用方法将失败。
答案 2 :(得分:1)
根据此链接:http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol.aspx
在“线程安全”下的底部,它说这种类型是线程安全的。但我不知道将它用作Singleton将是线程安全的。
答案 3 :(得分:1)
MSDN makes no mention,它是线程安全的:
线程安全
此类型是线程安全的。
班级安全,没有提及对象。
但是可以肯定地说它是不线程安全 - .NET库中没有对象是线程安全的。
(至少我从未见过一个)