У меня есть синхронный метод:Thread.Sleep или Task.Delay в синхронном методе как с синхронизацией и асинхронными вызывающей
public void DoStuff() {
DoThings();
GraphClient.SetExtendedProperty(user, propertyName, value); // this method occasionally throws an exception
DoOtherThings();
}
Call3rdPartyMethod
делает вызов REST API с помощью Azure Ad Graph Client API, который генерирует исключение при попытке для установки значения расширенного свойства в Active Directory и его не найти. Обычно это происходит с добавлением нового пользователя в каталог, и функция свойств расширения не расширила пользовательскую схему до того, как я хочу установить значения (кажется, это занимает несколько секунд).
я заменил вызов SetExtendedProperty с моей собственной оболочкой, содержащей вызов в цикле занят, ожидания, таким образом:
public void TrySetProperty(GraphObject user, string propertyName, string value)
{
var exceptions = new List<Exception>();
for (int retry = 0; retry < 5; retry++)
{
try
{
if (retry > 0)
Thread.Sleep(1000);
GraphClient.SetExtendedProperty(user, propertyName, value);
}
catch (Exception ex)
{
exceptions.Add(ex);
}
}
throw new AggregateException(exceptions);
}
}
Вопрос заключается в том, что я хочу, чтобы иметь возможность вызывать TrySetProperty
как от синхронного и асинхронного метода :
public void DoStuff() {
DoThings();
TrySetProperty(user, propertyName, value);
DoOtherThings();
}
public Task DoOtherStuffAsync() {
await DoAsyncThings();
TrySetProperty(user, propertyName, value);
await DoOtherAsyncThings();
}
Я не могу изменить SetExtendedProperty быть асинхронными, и я обеспокоен тем, я не должен использовать Thread.Sleep, если я звоню его от асинхронного метода - довольно Task.Delay(). Может ли кто-нибудь посоветовать?
никогда не смешивайте блокирующий код с асинхронным ждет. Это тупик, ожидающий случиться. Я бы предложил написать все ваши методы в асинхронном стиле без кода блокировки, затем используя [эту технику] (http://stackoverflow.com/a/5097066/14357), чтобы позволить себе синхронный вызов асинхронного метода. – spender
@Botonomary 'retry', чтобы избежать задержки с первой попытки, но вставьте задержку перед каждой следующей попыткой. –
удалил мой ответ, потому что @spender прав, это нехорошее предложение для смешивания методов асинхронного и синхронизирующего методов таким образом. –