C# 将数据从 While 循环传递给其他函数
C# Pass data from While loop to other functions
我在本地主机上有一个 Node.Js 服务器 运行 监听一些 API 请求。
这些请求通过 TCP/IP 传送到我的控制台应用程序。这是我的 c# 代码,它通过 GetData() 从节点服务器(托管在 localhost:9999)接收数据并将其传递给另一个函数 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 声明为全局,以便在整个应用程序中使用它。代码有效,我得到了输出。每次我向端口 9999 发出 API 请求时,我都会得到输出:
Connection Successfull...
Received data : somestring
Data to Send : somestring
我想知道这是否是一种有效的方法?
是否有另一种方法可以将 receive_data 传递给其他函数 'without' 使用while 循环中的函数(即;SendData())。?或者简单地说,将数据从一个无限的 while 循环传递给 main 或其他函数。
有什么建议吗?
您基本上有两种选择来进一步处理您收到的数据:
像您一样将它存储在某个地方(从设计的角度来看,您如何实现它并不重要)。需要考虑的一件事是,如果您想存储收到的数据列表 - “消息”,以及如果您收到另一条消息会发生什么。
调用方法并传递接收到的数据。这将是更好的方法,因为您抽象了实现并可以自由更改它(例如,从存储全局到消息接收器机制或其他)而无需更改您的接收代码。
方法 2) 具有更多信息和更多上下文,因为您在接收数据时触发该方法。在选项 1) 中,您不知道信息的存在时间,或者即使相同的信息被发送了多次。所以更多的信息(总是)更好,如果你在方法调用中不需要它,你可以自由地再次压缩它说一个全局变量。
对于方法 2),您应该记住,该方法是 运行 在您的循环“内部”,因此所有 long-运行 操作都会阻塞循环。但是您仍然可以自由地以某种方式实现它,允许在另一个线程(异步)中处理消息。
我在本地主机上有一个 Node.Js 服务器 运行 监听一些 API 请求。
这些请求通过 TCP/IP 传送到我的控制台应用程序。这是我的 c# 代码,它通过 GetData() 从节点服务器(托管在 localhost:9999)接收数据并将其传递给另一个函数 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 声明为全局,以便在整个应用程序中使用它。代码有效,我得到了输出。每次我向端口 9999 发出 API 请求时,我都会得到输出:
Connection Successfull...
Received data : somestring
Data to Send : somestring
我想知道这是否是一种有效的方法?
是否有另一种方法可以将 receive_data 传递给其他函数 'without' 使用while 循环中的函数(即;SendData())。?或者简单地说,将数据从一个无限的 while 循环传递给 main 或其他函数。
有什么建议吗?
您基本上有两种选择来进一步处理您收到的数据:
像您一样将它存储在某个地方(从设计的角度来看,您如何实现它并不重要)。需要考虑的一件事是,如果您想存储收到的数据列表 - “消息”,以及如果您收到另一条消息会发生什么。
调用方法并传递接收到的数据。这将是更好的方法,因为您抽象了实现并可以自由更改它(例如,从存储全局到消息接收器机制或其他)而无需更改您的接收代码。
方法 2) 具有更多信息和更多上下文,因为您在接收数据时触发该方法。在选项 1) 中,您不知道信息的存在时间,或者即使相同的信息被发送了多次。所以更多的信息(总是)更好,如果你在方法调用中不需要它,你可以自由地再次压缩它说一个全局变量。
对于方法 2),您应该记住,该方法是 运行 在您的循环“内部”,因此所有 long-运行 操作都会阻塞循环。但是您仍然可以自由地以某种方式实现它,允许在另一个线程(异步)中处理消息。