Не удается неявно преобразовать тип 'void' в 'object' в GetAwaiter (). GetResult () - PullRequest
0 голосов
/ 18 апреля 2020

Мы использовали следующий код для ожидания выполнения метода, так как у нас есть методы syn c, которые должны использовать асин c методы, и это оболочка, которую мы использовали в нашем проекте

public dynamic RunTask(dynamic method) {
   var result = Task.Run(async () => await method).ConfigureAwait(false);
   return result.GetAwaiter().GetResult();
}

Кажется как эта строка кода работает нормально, когда метод имеет возвращаемые типы ex: Task , но сегодня, когда я написал метод без возврата, он выдает исключение, когда нет значения возврата из задачи

   // throws exception in this case 'Cannot implicitly convert type 'void' to 'object'
   public async Task Run(){
        await //;
   }

   // Works
   public async Task<int> Fun(){
      return await //;
   }

Из сообщения явно невозможно назначить void объекту, но есть ли что-то, чего мне не хватает, как заставить его работать void задачи. Мы используем. net ядро ​​3.1. Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Вы звоните RunTask (); с методом ничего не возвращая? :)

0 голосов
/ 18 апреля 2020

Вы можете попробовать этот код для своих целей, однако, как рекомендует Мар c, это не рекомендуемая практика:

   public dynamic RunTask(dynamic method)
    {
       if (method is Task)
        {
            method.ConfigureAwait(false).GetAwaiter().GetResult();
            return 0;
        }
        else
        {
            var result = Task.Run(async () => await method).ConfigureAwait(false);
            return result.GetAwaiter().GetResult();
        }

    }
0 голосов
/ 18 апреля 2020

Во-первых, это плохая практика. Лучший способ асинхронного вызова c заключается в следующем шаблоне ожидания. Это выглядит примерно так:

private Task MyMethodAsync(){

}


public async void Main(){
    await MyMethodAsync();
}

Теперь реализовать шаблон ожидания может быть немного сложно, если он еще не создан (поскольку может потребоваться ожидание всех вызовов в цепочке). Вы можете сделать следующее:

MyMethodAsync().Wait()

Это заблокирует вызывающий поток и подождет, пока задача не будет выполнена. Поскольку он пуст, вы не получите никакого результата, и это основная причина, по которой вы получаете это исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...