Как создать универсальный метод расширения для асинхронных методов? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать метод .WithDelay(seconds);, который можно добавить в конце вызовов асинхронных методов.

Проблема, которую я получаю, заключается в том, что сначала вызывается асинхронный метод, а затем происходит задержка, я хочу наоборот, не меняя порядок вызова.

Например, я хочу await MyMethod().WithDelay(seconds); вместо await WithDelay(seconds).MyMethod();.

Вот что у меня есть, сначала он вызывает метод:

public async static Task<T> WithDelay<T>(this Task<T> task, int delay) {
  await Task.Delay(delay);
  return await task;
}

Я ожидаю, что сначала произойдет задержка, затем будет запущен фактический метод.

1 Ответ

4 голосов
/ 09 апреля 2019

Я хочу наоборот, не меняя порядок вызова.

Это невозможно, поскольку язык C # поддерживает только методы расширения для типов , а не методы .

Ближайший метод, который вы можете получить, - это метод расширения для делегатов:

public static async Task<T> WithDelay<T>(this Func<Task<T>> func, int delay) {
  await Task.Delay(delay);
  return await func();
}

Использование по-прежнему оказывается неудобным:

// Either:
Func<Task<MyType>> func = MyMethod;
var result = await func.WithDelay(1000);

// or (assuming "using static"):
var result = await WithDelay(MyMethod, 1000);

// What you really want, not currently possible:
// var result = await MyMethod.WithDelay(1000);

В подобных ситуациях, связанных с типами, сначала можно решить проблему синхронно, а затем преобразовать это решение в async.Если язык препятствует хорошему синхронному решению, то он, скорее всего, помешает хорошему асинхронному решению.

Существует предложение для методов расширения методов, но сегодня оно не является частью языка.

...