从异步方法获取更新时的 C# 封装
C# encapsulation when getting updates from asynchronous method
我有一个 tcp 连接,我想在服务器 class 的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。
private async void HandleConnectionAsync(TcpClient tcpClient)
{
Console.WriteLine("Got connection request from {0}", tcpClient.Client.RemoteEndPoint.ToString());
try
{
using (var networkStream = tcpClient.GetStream())
using (var reader = new StreamReader(networkStream))
using (var writer = new StreamWriter(networkStream))
{
writer.AutoFlush = true;
while (true)
{
string dataFromClient = await reader.ReadLineAsync();
Console.WriteLine(dataFromClient);
await writer.WriteLineAsync("FromServer-" + dataFromClient);
}
}
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
}
}
我希望能够接收 reader 放入 dataFromClient 的更新,而不必将我的代码放在我的服务器实现中 class。
所以:
static void Main(string[] args)
{
Server s = new Server();
s.start();
//get dataFromClient as it comes in here
}
问题是我不确定该怎么做。某种回调或事件?
方法有很多种。
最少的代码是将 Action 传递给您的服务器,例如:
Server s = new Server();
s.start(dataFromClient =>
{
// do something with data from client
});
并在 HandleConnectionAsync 中调用操作,例如:
private async void HandleConnectionAsync(TcpClient tcpClient, Action<string> callback)
{
..
// Console.WriteLine(dataFromClient);
callback(dataFromClient);
..
然而,这并没有解决一些问题,例如同时有很多客户端,需要知道哪个客户端是哪个。
我有一个 tcp 连接,我想在服务器 class 的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。
private async void HandleConnectionAsync(TcpClient tcpClient)
{
Console.WriteLine("Got connection request from {0}", tcpClient.Client.RemoteEndPoint.ToString());
try
{
using (var networkStream = tcpClient.GetStream())
using (var reader = new StreamReader(networkStream))
using (var writer = new StreamWriter(networkStream))
{
writer.AutoFlush = true;
while (true)
{
string dataFromClient = await reader.ReadLineAsync();
Console.WriteLine(dataFromClient);
await writer.WriteLineAsync("FromServer-" + dataFromClient);
}
}
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
}
}
我希望能够接收 reader 放入 dataFromClient 的更新,而不必将我的代码放在我的服务器实现中 class。 所以:
static void Main(string[] args)
{
Server s = new Server();
s.start();
//get dataFromClient as it comes in here
}
问题是我不确定该怎么做。某种回调或事件?
方法有很多种。
最少的代码是将 Action 传递给您的服务器,例如:
Server s = new Server();
s.start(dataFromClient =>
{
// do something with data from client
});
并在 HandleConnectionAsync 中调用操作,例如:
private async void HandleConnectionAsync(TcpClient tcpClient, Action<string> callback)
{
..
// Console.WriteLine(dataFromClient);
callback(dataFromClient);
..
然而,这并没有解决一些问题,例如同时有很多客户端,需要知道哪个客户端是哪个。