【问题标题】:Asynchronous web service call with shared resources使用共享资源的异步 Web 服务调用
【发布时间】:2011-06-13 08:37:40
【问题描述】:

我有一个异步调用的测试 Web 服务。我很惊讶它似乎工作正常,即使有一个(非惰性)单例,其中 get 方法没有锁。

例如,我的 Web 服务有一个单例,它有一个调用先前设置的工厂的 Get 方法(没有锁),工厂然后从预设的详细对象实例化一个新对象并返回新对象。

所以代码将如下进行:

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 服务调用在概念上是否以不同的方式工作?

【问题讨论】:

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


    【解决方案1】:

    这取决于您使用的是哪种异步调用。如果您使用基于事件的异步模式,则会自动完成同步,以便完成的事件在启动调用的同一线程上运行。

    我无法找到可靠的文档,但这是我在深入研究时发现的行为,请参阅What thread calls the completed event handler on silverlight WCF calls?

    编辑

    可在http://msdn.microsoft.com/en-us/library/ms228974.aspx 的“线程和上下文”部分找到验证已完成事件在正确线程上调用的文档。

    【讨论】:

    • 更新了我的答案,还有其他细节可以帮助吗?
    【解决方案2】:

    嗯,这在很大程度上取决于“get”方法中实际发生的情况;-)。不同步也可以正常工作。

    这也取决于你的网络服务器配置——也许它被配置为只启动一个线程?

    我必须承认,我并不完全清楚什么是异步 Web 服务调用。我假设您只是在拨打一系列电话而不等待前一个电话完成/

    【讨论】:

    • 服务代理生成了一个异步调用方法,它在不同的线程上调用web服务,当它返回时,代理将其移回主线程。
    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多