2 асинхронных службы WCF

У меня есть асинхронная служба WCF, которая использует клиентский прокси для вызова второй службы SOAP WCF. У меня нет контроля над службой SOAP Java, но я могу настроить конфигурацию ссылки на службу для асинхронного запуска.

Как я могу получить результат от 2-й асинхронной службы, чтобы передать значения обратно 1-му клиенту??

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);
    }
}

person mflair2000    schedule 15.10.2012    source источник


Ответы (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". Это означает, что новый экземпляр этого объекта создается при каждом его вызове. Я делаю это, потому что у нас есть задержка до 10 секунд, когда мы вызываем службу Java, и мы не хотим блокировать другие вызовы этой службы другими пользователями.

person Faster Solutions    schedule 15.10.2012
comment
Спасибо, я реализовал что-то подобное. Я пытаюсь повысить производительность службы Java, которая работает синхронно. Для Per Call это лучшая производительность, чем для каждого сеанса и многопоточности?? (или это перебор?) - person mflair2000; 16.10.2012
comment
PerCall означает, что вы создаете новый объект для каждого вызова службы. Если ваша служба не имеет состояния, это помогает с параллелизмом. PerSession существует, если вы делаете несколько запросов к одному и тому же объекту. Будьте благодарны, если вы можете принять и проголосовать за ответ! - person Faster Solutions; 17.10.2012