Возможность легко преобразовать синхронную последовательность операций в асинхронный код - это тема, о которой я писал довольно неплохо.Если вы хотите использовать мой подход, вам необходимо добавить следующие (относительно небольшие) куски кода:
Вот пример кода, который имеетописание того, что вы описываете в своем вопросе: -
IEnumerable<AsyncOperation> LoadSomeStuff(IList<string> urls)
{
for (string url in urls)
{
yield return AsyncOperationService.SwitchToBackgroundThread();
WebRequest req = WebRequest.Create(url);
WebResponse resp = null;
yield return req.GetResponseAsyncOp(r => resp = r);
using (resp)
{
// Do stuff with the Web Response such as construct model class instances from a stream.
}
// When ready to actually start touching the UI
yield return AsyncOperationService.SwitchToUIThread();
// Do stuff to the UI
}
}
использование:
List<string> urls = new List<string> {"pinkElephants.xml", "whileElephants.xml"}
LoadSomeStuff(urls).Run(err =>
{
if (err == null)
{
// Cool, it all worked and I probably don't need to do anything
}
else
{
// Something bad happened, lets tell the user about it in the UI somehow.
}
});
Обратите внимание, что это не самый эффективный код.Однако во многих случаях время, необходимое для доставки HTTP-ответа, значительно превышает время, затрачиваемое остальным кодом, поэтому неэффективность может быть весьма незначительной и оправдывать уменьшенную сложность кода.