使用共享资源调用异步Web服务

时间:2011-06-13 08:37:41

标签: multithreading web-services asynchronous .net-2.0

我有一个我异步调用的测试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服务调用在概念上是以不同的方式工作吗?

2 个答案:

答案 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服务调用并不完全清楚。我假设您只是在进行一系列调用而不等待前一个调用完成/