Как я могу вернуть строку из функции asyn c? - PullRequest
0 голосов
/ 05 марта 2020
    class MyHttpClientClass
    {
        public async static string Getrequest(string url, string port)
        {
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = await client.GetAsync("http://" + url + ":" + port + "/"))
                {
                    using (HttpContent content = response.Content)
                    {
                        return await content.ReadAsStringAsync();
                    }
                }
            }
        }
    }

Этот исходный код дает мне ошибку во время компиляции:

Возвращаемый тип асинхронного c метода должен быть void, Task или Task<T>

Как я могу вернуть строку из этого метода без использования out или ref?
Я также хочу избавиться от шаблона async / await.

Ответы [ 4 ]

9 голосов
/ 05 марта 2020

Измените это, чтобы вернуть Task<string>:

public async static Task<string> Getrequest(string url, string port)
1 голос
/ 05 марта 2020

Если вы не хотите асинхронизировать / ждать, вы можете использовать это

    public static string Getrequest(string url, string port)
    {
        using (var client = new WebClient())
        {
            return client.DownloadString("http://" + url + ":" + port + "/");
        }
    }
1 голос
/ 05 марта 2020

Метод asyn c может возвращать только следующие типы:

  • void (на самом деле это не тип возврата, используемый для указания того, что вы не хотите получать уведомление о завершении базового процесса). task, полезно только при подключении обработчика событий asyn c, поскольку тип делегата заморожен.)
  • Task (метод не возвращает значение, syn c версия будет иметь тип возвращаемого значения void.)
  • Task<T> (метод возвращает задачу, результат которой имеет тип T, syn c версия будет иметь тип возврата T).
  • ValueTask (метод не возвращает значение, использует ValueTask для производительности, syn c версия будет иметь тип возвращаемого значения void).
  • ValueTask<T> (метод возвращает задачу аналогичного типа T, использует ValueTask для производительности, версия syn c будет иметь тип возврата T .)
  • IAsyncEnumerable<T> (метод возвращает асинхронный c поток T, новая функция введена в C# 8.0.)

Сообщение об ошибке, которое вы видите, это Компилятор пытается сказать вам, что вы не соответствуете ожиданиям. Само сообщение об ошибке является неполным, даже в документации по asyn c методам на docs.microsoft.com не упоминается последний случай. Вот github проблема , чтобы отследить это изменение.

0 голосов
/ 05 марта 2020

Если вы хотите выполнить его последовательно и блокировать (вместо использования async / await), вы можете превратить все асинхронные c методы в «syn c», используя .Result

p.GetStringAsync().Result
content.ReadAsStringAsync().Result

Вы можете использовать это, но это снизит производительность, если операция займет много времени.

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