我有一个我异步调用的测试Web服务。我很惊讶它似乎工作正常,即使有一个(非惰性)单例,其中get方法没有锁。
例如,我的Web服务有一个单例,它有一个调用先前设置的Factory的Get方法(没有锁定),然后工厂从预先设置的详细对象中实例化一个新对象并返回新对象。 / p>
所以代码将按如下方式进行:
MethodCalledFromSingleton{
Instantiate Obj A
Use stored object to set properties of Obj A
Instantiate Object B
Assign Object B to a property of Object A
Return Object A
}
在一个显式多线程环境中,一个线程可以实例化该对象,然后在它返回之前,另一个线程可以实例化另一个对象,然后返回。然后两个线程都不能指向相同的引用吗?
但是,正如我所说,我没有遇到任何问题,因此,与显式线程化代码相比,异步Web服务调用在概念上是以不同的方式工作吗?
答案 0 :(得分:1)
这取决于您使用的是哪种异步调用。如果使用基于事件的异步模式,则会自动完成同步,以便在发起调用的同一线程上运行已完成的事件。
我无法找到可靠的文档,但这是我在深入研究时发现的行为,请参阅What thread calls the completed event handler on silverlight WCF calls?。
验证在正确的线程上调用已完成事件的文档可以在http://msdn.microsoft.com/en-us/library/ms228974.aspx的“线程和上下文”部分找到。
答案 1 :(得分:0)
嗯,这在很大程度上取决于“get”方法实际发生的事情;-)。它可以在没有同步的情况下正常工作。
这还取决于您的Web服务器配置 - 可能它配置为只启动一个线程吗?
我必须承认,对我来说什么是异步Web服务调用并不完全清楚。我假设您只是在进行一系列调用而不等待前一个调用完成/