C# Передает данные из цикла While в другие функции

#c# #.net #function #while-loop #console-application

Вопрос:

У меня есть Узел.Сервер Js, работающий на локальном хосте, прослушивает некоторые запросы API.

Эти запросы передаются в мое консольное приложение по протоколу TCP/IP. Вот мой код c#, который получает данные с сервера узла (размещенного на локальном хосте:9999) через getData() и передает их другой функции sendData().

 namespace Datatransfer
{
    /* global variable declaration*/
    class Global
    {
        public static string receive_data;
    }

    class Program
    {
        static string HOST = "localhost";
        static int PORT = 9999;
        static TcpClient client;

      
        /*Function to receive data*/
        static string GetData()
        {
            while (true)
            {
                NetworkStream nwStream = client.GetStream();
                byte[] bytesToRead = new byte[client.ReceiveBufferSize];
                int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
                Global.receive_data= Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
                Console.WriteLine("Received data : "   Global.receive_data);
                SendData(Global.receive_data)
            }
        }

        /*Function to  send data*/
        static void SendData(string val)
        {
           /*Code to process recevied_data..*/
            Console.WriteLine("Data to Send : "   Global.receive_data);
           /*some codes....*/
        }

        static void Main(string[] args)

        {
            client = new TcpClient();
            client.Connect(HOST, PORT);
            GetData();
            
        }
    }
}
 

Я объявил receive_data глобальными, чтобы использовать их в приложении. Код работает, и я получаю вывод. Каждый раз, когда я делаю запрос API на порт 9999, я получаю вывод в виде :

 Connection Successfull...
Received data : somestring
Data to Send : somestring
 

Мне было интересно, является ли это эффективным способом или нет ?

Есть ли другой способ, с помощью которого receive_data могут быть переданы другим функциям » без « использования функции ( т. Е. sendData() ) внутри цикла while.? Или, проще говоря, передавать данные из бесконечного цикла while в основные или другие функции.

Есть какие-нибудь предложения?

Ответ №1:

В основном у вас есть два варианта дальнейшей обработки полученных данных:

  1. Сохраните его где-нибудь, как вы это сделали (с точки зрения дизайна не имеет значения, как вы это реализуете). Только об одном нужно подумать, если вы хотите сохранить список полученных данных-«сообщения», и что произойдет, если вы получите другое сообщение.
  2. Вызовите метод и передайте полученные данные. Это был бы лучший подход, потому что вы абстрагируетесь от реализации и можете свободно изменять ее (например, от глобального хранения до механизма приема сообщений или чего-либо еще) без изменения кода приема.

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

Для подхода 2) вы должны иметь в виду, что метод выполняется «внутри» вашего цикла, поэтому все длительные операции будут блокировать цикл. Но все же вы можете реализовать его таким образом, чтобы сообщение обрабатывалось в другом потоке (асинхронно).