Во-первых, я рекомендую использовать Полли . Он широко используется, тщательно протестирован и имеет встроенную поддержку как асинхронного, так и синхронного использования.
Но если вы хотите продолжать использовать свой собственный, вы можете добавить синхронный эквивалент:
public async Task RetryAsync(Func<Task> _action, int _ms = 1000, int _counter = 3);
public void Retry(Action _action, int _ms = 1000, int _counter = 3);
, который можно назвать таковым:
Retry(() => {
_newID = myDBFunction();
}, 300);
Если вы хотите всегда помещать синхронный код в пул потоков, вы можете добавить перегрузку для этого:
public async Task RetryAsync(Func<Task> _action, int _ms = 1000, int _counter = 3);
public async Task RetryAsync(Action _action, int _ms = 1000, int _counter = 3) =>
await RetryAsync(() => Task.Run(_action), _ms, _counter);
, который можно назвать таковым:
await RetryAsync(() => {
_newID = myDBFunction();
}, 300);