Взгляните на несколько моих постов в блоге по этому вопросу: -
Простой асинхронный оператор Runner - Часть 1
Простой асинхронный оператор Runner - Часть 2
Статьи немного глубоки, потому что они сосредоточены на фактической реализации, идея не должна включать в себя модные фреймворки, просто чтобы сделать это.Единственный код, который вам нужен, на самом деле есть в статьях, никаких дополнительных dll или zip-файлов для загрузки.
Однако обратите внимание на часть 2, способ представить, как будет выглядеть ваш код, если бы было возможно синхронное кодирование.В вашем случае ваш код будет выглядеть так: -
void StuffToDo()
{
doFirstGet(someParams);
doSecondGet(someParams);
doThirdGet(...);
}
Следующим шагом является изменение содержимого методов "do", чтобы вместо него возвращалось AsyncOperation
.В настоящее время они, вероятно, выглядят примерно так: -
void doFirst(someParams, Action callback)
{
SomeAsyncObj thing = new SomeAsyncObj();
thing.OnCompleted += (s, args) { callback() };
thing.DoSomethingAsync();
}
Вы должны преобразовать его в: -
AsyncOperation doFirst(someParams)
{
return (completed) =>
{
SomeAsyncObj thing = new SomeAsyncObj();
thing.OnCompleted += (s, args) =>
{
try
{
completed(null);
}
catch (Exception err)
{
completed(err);
}
};
thing.DoSomethingAsync(source);
};
}
Третий шаг - изменить ваш воображаемый синхронный код следующим образом: -
IEnumerable<AsyncOperation> StuffToDo()
{
yield return doFirstGet(someParams);
// Do some other synchronous stuff here, this code won't run until doFirstGet has completed.
yield return doSecondGet(someParams);
// Do some other synchronous stuff here, this code won't run until doSecondGethas completed.
yield return doThirdGet(...);
// Do some final synchronous stuff here, this code won't run until doThirdGethas completed.
}
Наконец, вызов StuffToDo
меняется на: -
StuffToDo().Run((err) =>
{
// report any error in err sensibly
});