我正在創建一個可以有多個客戶端的異步服務器。與聊天客戶端/服務器體系結構類似,所有客戶端都根據任何客戶端的請求更新每個服務器狀態更改。我發現了很多示例可供遵循,並編寫了一個簡單的測試應用程序。我剛剛寫過客戶端請求的處理,但遇到了我通常不會遇到的情況。下面是我寫的樣本服務器:應該始終等待任務嗎?
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();
}
}
我得到的進程調用一個警告,因爲任務不等待。我理解沒有等待調用的代碼的行爲,但我想知道是否應該以不同的方式進行編碼(ThreadPool等),即使這給了我想要的行爲。是否應該等待任務?
'如果任務總是期待已久的'不...消防忘記任務也有一些用法.. –