【发布时间】:2017-02-11 22:24:26
【问题描述】:
我正在创建一个可以有多个客户端的异步服务器。与聊天客户端/服务器架构类似,所有客户端都会根据任何客户端的请求在每次服务器状态更改时更新。我找到了很多可以遵循的示例,并编写了一个简单的测试应用程序。我现在刚刚写了客户端请求的处理,但是遇到了我通常不会遇到的情况。这是我编写的示例服务器:
class Server
{
int _port;
TcpListener _listener;
IList<TcpClient> _clients = new List<TcpClient>();
public Server(int port)
{
_port = port;
_listener = new TcpListener(IPAddress.Any, _port);
}
public async Task StartListening()
{
_listener.Start();
Console.WriteLine("The server is listening on port {0}...", _port);
while (true)
{
try
{
var client = await _listener.AcceptTcpClientAsync();
Console.WriteLine("We have a client!");
_clients.Add(client);
Process(client);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
private async Task Process(TcpClient client)
{
try
{
var stream = client.GetStream();
var reader = new StreamReader(stream);
var writer = new StreamWriter(stream) { AutoFlush = true };
char[] buffer = new char[1024];
while (true)
{
var request = await reader.ReadLineAsync();
if (request != null)
{
Console.WriteLine(request);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
client.Close();
}
}
}
这是 Program.cs:
class Program
{
static void Main(string[] args)
{
var server = new Server(6029);
server.StartListening().Wait();
}
}
我在 Process 调用中收到警告,因为没有等待 Task。我在没有 await 调用的情况下理解代码的行为,但我想知道是否应该以不同的方式编码(线程池等),即使这给了我想要的行为。是否应始终等待任务?
【问题讨论】:
-
Should Tasks always be awaited?No...Fire&Forget 任务也有一些用法..
标签: c# asynchronous tcp client-server task