Вызов метода и ожидание возвращаемого значения - PullRequest
4 голосов
/ 11 марта 2009

Как я вызываю метод, который возвращает bool, но внутри этого метода для определения значения bool он вызывает веб-сервис асинхронно?

bool myBool = GetABoolean(5);    

public bool GetABoolean(int id)
{

  bool aBool;

  client.CallAnAsyncMethod(id);  // value is returned in a completed event handler.  Need to somehow get that value into aBool.

  return aBool;  // this needs to NOT execute until aBool has a value

}

Итак, мне нужно, чтобы метод GetABoolean дождался завершения CallAnAsyncMethod и вернул значение, прежде чем вернуть bool обратно в вызывающий метод.

Я не уверен, как это сделать.

Ответы [ 5 ]

8 голосов
/ 11 марта 2009

Большинство асинхронных методов возвращают IAsyncResult.

Если это так, вы можете использовать IAsyncResult.AsyncWaitHandle для блокировки (IAsyncResult.AsyncWaitHandle.WaitOne) для блокировки до завершения операции.

есть:

bool aBool;</p> <p>IAsyncResult res = client.CallAnAsyncMethod(id); res.AsyncWaitHandle.WaitOne(); // Do something here that computes a valid value for aBool! return aBool;

4 голосов
/ 11 марта 2009

Либо вызовите метод синхронно, либо добавьте для него обработчик события CallAnAsyncMethodCompleted и используйте объект e.Result для работы с возвращаемым значением.

3 голосов
/ 11 марта 2009

Можно ли просто вызвать веб-метод синхронно?

2 голосов
/ 11 марта 2009

Это уже третий раз за последние дни, когда я видел подобные вопросы, поэтому я задам несколько вопросов (ответ на ОП очевиден).

Почему вы рассматриваете асинхронный вызов веб-службы? Спектакль? Не блокируете рабочий поток?

Вы видели пример, который побуждает вас использовать асинхронный вызов веб-службы? Если да, не могли бы вы опубликовать URL примера?

Спасибо за ваше время. Ваши ответы на эти вопросы помогут мне ответить другим.


Я добавил тег «silverlight» к этому вопросу и предлагаю вам сделать то же самое в будущем для вопросов Silverlight. Это создает контекст, в котором все «блокирующие» вызовы должны быть асинхронными.

Теперь эксперт SilverLight должен ответить, но я думаю, что вы поступаете неправильно. Вы теряете асинхронный характер вызова. Я думаю, что ваш метод GetABoolean также должен быть асинхронным и не должен возвращаться, пока не получит ответ.

0 голосов
/ 11 марта 2009

Если между вызовом CallAnAsyncMethod и возвратом есть больше кода, то есть потенциальная ценность в выполнении этого асинхронно (хотя это, вероятно, излишняя предоптимизация), иначе синхронизируйте ваш код.

Если у вас нет никакого контроля над архитектурой, которая заставляет вас делать этот код асинхронно, вам придется отслеживать переменную и цикл для ожидания завершения.

bool myBool;
bool retrievingMyBool;
RetrieveABoolean(5);    

public bool RetrieveABoolean(int id)
{
    client.CallAnAsyncMethod(id);  // value is returned in a completed event handler.  Need to somehow get that value into aBool.
    retrievingMyBool = true;
    while (retrievingMyBool)
    {
        Thread.Sleep(100);
    }
}

private void completedEventHandler([[parameters go here]])
{
    // code to handle parameters
    myBool = // whatever
    retrievingMyBool = false    
}

Это ужасное решение, которое в будущем вызовет у вас гигантские головные боли, особенно если вам когда-нибудь понадобится код, обеспечивающий многопоточную защиту, но, как взлом, он может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...