Да, прежде чем вы сможете перейти к следующему шагу алгоритма, вам нужно получить результат предыдущего шага, что может быть сложно, если вам нужно использовать асинхронные методы.
Если этого не происходит в потоке пользовательского интерфейса, вы можете просто заблокировать и дождаться ответа. Например, имейте каждый «завершенный» сигнал метода (используя любые примитивы синхронизации, доступные в Silverlight; я не знаю, например, есть ли ManualResetEvent, если так, имеет завершенный обратный вызов .Set()
), а затем ваш основной Метод PopulateControl вызывает вызов FooAsync () и затем блокируется до тех пор, пока ManualResetEvent не подаст сигнал (путем вызова .Wait()
).
Если это в потоке пользовательского интерфейса, и вам действительно нужно написать неблокирующее решение, то гораздо, намного сложнее правильно написать это в C #. Вместо этого вы можете рассмотреть возможность использования F #, где async
s обеспечивает хорошую модель программирования для неблокирующих вызовов.
EDIT:
Пример псевдокода для блокировки результатов:
// class-level
ManualResetEvent mre = new ManualResetEvent(false);
// some method that needs to make WCF call and use results
void Blah() {
// yadda yadda
proxy.FooCompleted += (o,ea) => { ... mre.Set(); };
proxy.FooAsync(...);
mre.WaitOne(); // block until FooCompleted
// use results from FooCompleted now that they're here
// mre.Reset() if you intend to use it again later
}
Я использовал лямбду для FooCompleted, но использование отдельного метода, как у вас тоже хорошо.