Задержка в объявлении переменной StreamWriter - PullRequest
2 голосов
/ 15 мая 2019

В моем приложении C # у меня есть цикл while, который собирает строку из очереди сообщений Redis и отправляет ее на прослушивающий сервер.На каждом цикле соединение открывается с помощью метода Post HttpWebRequest, а данные отправляются с помощью переменной StreamWriter.Проблема в том, что после отправки двух строк приложение зависает, не возвращая никакой ошибки, оно просто ничего не делает в течение, возможно, минуты, после этого оно снова работает правильно и продолжает свою работу для другой пары строк, замораживания и так далее.Отладка показывает, что задержка происходит во время объявления переменной StreamWriter.

Вот ядро ​​кода:

// configure Redis
var redis = new RedisClient("127.0.0.1");

while (true)
{
    // read from Redis queue
    string json = redis.BRPop(30, "sensors_data");

    //...
    //URL DECLARATION
    //...

    try
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentLength = json.Length;
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";
        httpWebRequest.Proxy = null;

            SendDataAsync(json, url);
        }
    }

    static async Task SendDataAsync(string json, string url)
    {
        try
            {
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.ContentLength = json.Length;
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";
            httpWebRequest.Proxy = null;

            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                try
                {
                    streamWriter.Write(json);
                    streamWriter.Flush();
                    streamWriter.Close();
                    Console.Write("Data Sent");
                }
                catch (Exception e)
                {

                    Console.WriteLine(e.Message);
                }
            }

        }
        catch (Exception err)
        {
            Console.Write(err.Message);
        }
        Console.WriteLine();
    }

Таким образом, код на самом деле работает, просто есть какая-то странная огромная задержка, когдаречь идет об объявлении StreamWriter.У кого-нибудь есть идеи?Я не знаю, как справиться с проблемой.

РЕДАКТИРОВАТЬ

        while (true)
        {
            i = 0;
            // read from Redis queue
            string json = redis.BRPop(30, "sensors_data");

            try
                {
                    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                    httpWebRequest.ContentLength = json.Length;
                    httpWebRequest.ContentType = "application/json";
                    httpWebRequest.Method = "POST";
                    httpWebRequest.Proxy = null;
                using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                    {
                        try
                        {
                            streamWriter.Write(json);
                            streamWriter.Flush();
                            streamWriter.Close();
                            var response = httpWebRequest.GetResponse();
                            StreamReader reader = new StreamReader(response.GetResponseStream());
                            string reply=reader.ReadToEnd();
                            Console.WriteLine(reply);
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message);
                        }
                    }
            }
                catch (Exception err)
                {
                    Console.Write(err.Message);
                }

                Console.WriteLine();
        }

1 Ответ

0 голосов
/ 19 мая 2019

Нашел решение: по-видимому, необходимо получить ответ от сервера, после того как я добавил httpWebRequest.GetResponse() и следующие две строки я больше не нашел задержек.

Предложение: лучшеиспользовать WebClient, это не доставило мне никаких проблем с первой попытки.

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