0

Пытаюсь получить ответ от сайта без блокировки UI:

async Task<string> HttpGetOnlineAsync(string params)
{
    try
    {
        HttpClient hc = new HttpClient();
        Task<Stream> result = hc.GetStreamAsync(URL + params);
        Stream stream = await result;
        StreamReader reader = new StreamReader(stream);
        return await reader.ReadToEndAsync(); 
    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());
        return null;
    }
}

И делее вызываю метод:

var o = JObject.Parse(await HttpGetOnlineAsync(params));

На строке:

Stream stream = await result;

Вылезает ошибка и перекидывает в дизассемблированный код.


Вот так все работает но фризит. Мне нужно сделать:

var resp = request.GetResponse();

async так как фризится UI:

try
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
    var resp = request.GetResponse();
    Stream stream = resp.GetResponseStream();
    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
    return await reader.ReadToEndAsync();
 }
 catch (Exception e)
 {
     MessageBox.Show(e.ToString());
     return null;
 }

Да хоть все в using оберни:

async Task<string> HttpGetOnlineAsync(string twitchname)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.twitch.tv/kraken/streams/" + twitchname + ClientID);
        {
            using (var resp = await request.GetResponseAsync())
            {
                using (Stream stream = resp.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                    {
                        return await reader.ReadToEndAsync();
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());
        return null;
    }
}

Все равно с ошибкой.

var resp = await request.GetResponseAsync()

Как будто код выполняется не дожидаясь await.

0xdb
  • 51,614
Anulyev
  • 335
  • 2
    Ошибка то хоть какая? – EvgeniyZ Nov 14 '18 at 15:28
  • ArgumentNullException: Значение не может быть неопределенным. – Anulyev Nov 14 '18 at 15:34
  • а почему не воспользоваться функцией GetStringAsync? – Grundy Nov 14 '18 at 15:34
  • В таком виде даже не скомпилируется: HttpGetOnlineAsync(string params) – Grundy Nov 14 '18 at 15:37
  • GetStringAsync Использовал. Task result находится в Status = WaitingForActivation, Method = "{null}", Result = "{Еще не вычислено})". Толи не успевает загрузится до обработки результата толи не запускается задача. HttpGetOnlineAsync(string params) - без async фризит UI – Anulyev Nov 14 '18 at 15:41
  • Я не загружаю страницу. Я получаю ответ от нее. В виде строки. Но отправка запроса ( Task result = hc.GetStreamAsync(URL + params);) и чтение результата(reader.ReadToEndAsync(); ) фризит UI если делать без async – Anulyev Nov 14 '18 at 15:46
  • 1
    string params действительно не компилируется. Покажите компилирующйися код. В примере с WebRequest используется URL, в примере с HttpClient используется URL + params. Ну и так по мелочи: HttpClient, Stream, StreamReader - всё это нужно диспозить (используйте using). – Alexander Petrov Nov 14 '18 at 16:50
  • Если из трех разных кусков кода работает только один - смотри чем конкретно они отличаются. – Grundy Nov 15 '18 at 06:28

0 Answers0