0

我有一个异步 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);
    }
}
4

1 回答 1

0
   [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 秒的延迟,并且我们不想阻止其他用户对该服务的其他调用。

于 2012-10-15T15:12:04.857 回答