【问题标题】:2 Async WCF services2 异步 WCF 服务
【发布时间】:2012-10-15 13:50:06
【问题描述】:

我有一个异步 WCF 服务,它使用客户端代理调用第二个 SOAP WCF 服务。我无法控制 SOAP Java 服务,但我可以将服务引用上的配置设置为异步运行。

我如何从第二个异步服务获得结果,将值传递回第一个异步服务到客户端??

public class AddService : IAddService
{
    // SOAP Java service reference

    ResultServiceClient proxy = new ResultServiceClient();

    public int AddNumbers(int x, int y)
    {

        // Am i on the right track here to use BeginXXX, EndXXX?
        proxy.BeginGetResult(x, y, new AsyncCallback(OnEndAdd), null);

        /// how to return a result here.??????
        return result;
    }

    void OnEndAdd(IAsyncResult result)
    {
        int result = proxy.EndGetResult(result);
    }
}

【问题讨论】:

    标签: wcf asynchronous


    【解决方案1】:
       [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
        public class AddService : IAddService 
        { 
            // SOAP Java service reference 
            ManualReseEvent _resetEvent=new ManualResetEvent(false); 
            ResultServiceClient proxy = new ResultServiceClient(); 
            private int _result=-1;
    
            public int AddNumbers(int x, int y) 
            { 
    
                // Am i on the right track here to use BeginXXX, EndXXX? 
                proxy.BeginGetResult(x, y, new AsyncCallback(OnEndAdd), null); 
                _resetEvent.WaitOne(TimeSpan.FromSeconds(10);
                return _result; 
            } 
    
            void OnEndAdd(IAsyncResult result) 
            { 
                _result = proxy.EndGetResult(result); 
                _resetEvent.Set();
            } 
        } 
    

    这是怎么回事?

    我们进行调用,然后使用 ManualResetEvent 暂停线程并等待回调。 ManualResetEvent 被告知等待 10 秒,然后继续执行。

    ManualResetEvent 有多个 Wait 方法的重载,从无限 - Wait() - 到我正在使用的,它需要一个 TimeSpan。 _result 现在是一个成员变量,因此我们可以从初始调用方法中访问该值。我还用“PerCall”服务行为标记了该服务。这意味着每次调用都会实例化该对象的一个​​新实例。我这样做是因为我们在调用 Java 服务时有长达 10 秒的延迟,并且我们不想阻止其他用户对该服务的其他调用。

    【讨论】:

    • 谢谢,我实现了类似的东西。我正在尝试提高似乎同步运行的 Java 服务的性能。对于每个呼叫,这是否比每个会话和多线程更好的性能? (或者这是矫枉过正?)
    • PerCall 意味着每次调用服务都创建一个新对象。如果您的服务是无状态的,那么它有助于并发。如果您对同一个对象发出多个请求,PerSession 就在那里。如果您能接受并投票支持答案,将不胜感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2011-05-04
    • 1970-01-01
    • 2010-12-25
    • 2012-07-16
    • 2014-11-09
    相关资源
    最近更新 更多