#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:
В основном у вас есть два варианта дальнейшей обработки полученных данных:
- Сохраните его где-нибудь, как вы это сделали (с точки зрения дизайна не имеет значения, как вы это реализуете). Только об одном нужно подумать, если вы хотите сохранить список полученных данных-«сообщения», и что произойдет, если вы получите другое сообщение.
- Вызовите метод и передайте полученные данные. Это был бы лучший подход, потому что вы абстрагируетесь от реализации и можете свободно изменять ее (например, от глобального хранения до механизма приема сообщений или чего-либо еще) без изменения кода приема.
Подход 2) содержит больше информации и больше контекста, потому что вы запускаете метод в момент получения данных. В варианте 1) у вас нет информации о том, сколько лет этой информации, или даже если одна и та же информация была отправлена несколько раз. Таким образом, дополнительная информация (всегда) лучше, если она вам не нужна в вызове метода, вы можете снова сжать ее, чтобы указать глобальную переменную.
Для подхода 2) вы должны иметь в виду, что метод выполняется «внутри» вашего цикла, поэтому все длительные операции будут блокировать цикл. Но все же вы можете реализовать его таким образом, чтобы сообщение обрабатывалось в другом потоке (асинхронно).