C # WebClient зависает через некоторое время (истина) цикла - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над своим Grade Project и сталкиваюсь с этой проблемой. Я делаю панель управления для парковки и использую Arduino для чтения датчиков и WebServer, который отправляет значения датчиков в файле JSON подключенному клиенту.

Я создал форму C #это указывает, есть ли автомобиль, припаркованный на месте 1,2, и т. д. Итак, я разработал небольшую форму, которая делает это, она содержит вторую угрозу, которая выполняет бесконечный цикл, который создает WebClient, который будет собирать JSON изArduino WebServer и, когда это будет сделано, будет обработан JSON, и будут отображаться пятна.

Через несколько секунд поток зависает, а конкретный WebClient, открывающий чтение, просто зависает. Я потратил несколько дней, чтобы узнать, как решить эту проблему, но пока безуспешно. Поэтому я попытался создать другой поток, который проверяет, было ли установлено соединение, и для получения данных требуется больше секунды, он попытается прервать поток WebClient и создать новый, чтобы возобновить получение JSON, который я думал.

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

Я сдался и решил спросить об этом в StackOverflow, потому что не могу найти решение.

это моя ветка для WebClient:

private void startConnectionThread()
    {
        new Thread(() =>
        {
            while (true)
            {
                try
                {
                    WebClient client = new WebClient();
                    Stream data = client.OpenRead("http://192.168.0.177/");
                    StreamReader reader = new StreamReader(data);
                    strResult = reader.ReadToEnd();
                    data.Close();
                    reader.Close();
                    handleResult(strResult);
                    Thread.Sleep(1000);
                }
                catch (Exception ex)
                {

                }
            }
        }).Start();
    }

Я могуиспользовать всю вашу помощь. Заранее спасибо.

РЕДАКТИРОВАТЬ: Это мой метод с HttpClient та же проблема, но через несколько секунд замораживающее соединение обновляется и снова работает, я вижу это как решение моей проблемы. И когда я добавляю client.Timeout = TimeSpan.FromMilliseconds(300);, это сокращает время ожидания.

private void startConnectionThread()
    {
        new Thread(async() =>
        {
            HttpClient client = new HttpClient();
            client.Timeout = TimeSpan.FromMilliseconds(200);

            while (true)
            {
                try
                {
                    HttpResponseMessage response = await client.GetAsync("http://192.168.0.177/");
                    strResult = await response.Content.ReadAsStringAsync();
                    handleResult(strResult);
                }
                catch (Exception ex)
                {

                }
            }

        }).Start();
    }

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Это, кажется, решение для меня, используя HttpClient, и изменение свойства тайм-аута сделало изменение.

private void startConnectionThread()
{
    new Thread(async() =>
    {
        HttpClient client = new HttpClient();
        client.Timeout = TimeSpan.FromMilliseconds(200);

        while (true)
        {
            try
            {
                HttpResponseMessage response = await client.GetAsync("http://192.168.0.177/");
                strResult = await response.Content.ReadAsStringAsync();
                handleResult(strResult);
            }
            catch (Exception ex)
            {

            }
        }

    }).Start();
}
0 голосов
/ 31 октября 2019

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

Так что выведите его из цикла...

 var client = new WebClient();     

 while (true)
        {
            try
            {

                using (var data = client.OpenRead("http://192.168.0.177/"))
                {                
                    using (var reader = new StreamReader(data))
                    {
                        strResult = reader.ReadToEnd();
                        handleResult(strResult);
                        Thread.Sleep(1000);
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }
...