2009-03-11 4 views
3

Как мне вызвать метод, который возвращает 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 не завершен, и возвратил значение, прежде чем вернуться обратно логическим значением вызывающего метода.

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

+0

Вот и вся POINT вызова async - вам не нужно ждать результата .... Итак, если вы хотите получить результат - просто назовите его синхронно! –

+0

Является ли причиной асинхронного вызова, что он не под вашим контролем? Если нет, марк на точку. Не переутомляйте (см. Мой ужасно сложный пример именно по этой причине). –

+0

Это для порта к Силуэйт. В противном случае мои звонки оставались бы синхронными, и я был бы намного счастливее! – ScottG

ответ

3

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

+1

Не в Silverlight;) –

9

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

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

т.е.

 
bool aBool;

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

4

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

2

Это, по крайней мере, в третий раз в последние дни я видел такой вопрос, поэтому я задам несколько вопросов (ответ на OP очевиден).

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

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

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


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

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

+0

Я пытаюсь перенести этот код WPF на Silverlight и нуждаюсь в вызовах для асинхронных вызовов – ScottG

+0

Спасибо за ввод. У меня есть много таких кодов, где у меня есть метод, который возвращает значение. Внутри этого метода он выполняет служебный вызов. Ранее этот вызов был синхронизирован. Мне нужно сделать это async ... но мне нужно, чтобы он сидел там в этом методе до тех пор, пока не вернется служебный вызов. – ScottG

+0

Опять же, «нет, нет». Сделать метод вызова async, и вам не нужно сидеть в нем. –

0

Если между вызовом 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  
} 

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

Смежные вопросы