Так же, как: -
четный * нечетный = четный
так же:
async * sync = async.
Вы пытаетесь сделать async * sync = sync
, и это то, что вас сбивает с толку. Как только вы добавляете асинхронную операцию в последовательность, вся последовательность становится асинхронной. Если вы можете заставить свою внешнюю операцию SaveValue
признать, что она асинхронная, тогда все может работать лучше.
Поскольку код будет следовать совершенно разным путям, в зависимости от того, является ли зашифрованное значение истинным или нет, в действительности должно быть две версии SaveValue
.
Например: -
public static void SaveValue(string key, object value)
{
App Appvars = Application.Current as App;
if (Appvars.Settings.Contains(key))
Appvars.Settings[key] = value;
else
Appvars.Settings.Add(key, value);
}
public static void SaveValue(string key, object value, Action doneCallback)
{
var Registrator = new RegistratorClient();
Registrator.EncryptCompleted += (s, args) =>
{
// Really should consider some exception handling here.
SaveValue(key, s.Result);
if (doneCallback != null)
doneCallback();
}
Registrator.EncryptAsync(value); //async call
}
В этой версии первый SaveValue является синхронным, тогда как второй, который выполняет шифрование, является асинхронным и по завершении вызовет doneCallback. Этот обратный вызов позволяет этой асинхронной версии SaveValue
участвовать в дальнейшей последовательности асинхронных операций.