Я изучаю C# и начал узнавать о таких вещах, как асинхронное программирование, потоки и сокеты, поэтому я попытался поэкспериментировать с этими концепциями и сделал простую программу, которая технически представляет собой две программы с одной серверной и одной клиентской сторонами. сторона сервера ожидает входящего соединения, и клиент подключается к серверу, а затем и клиент, и сервер могут отправлять текст друг другу, и текст будет виден на другой стороне.
серверная часть:
class Program
{
static void Main(string[] args)
{
var client = Conection();
while (true)
{
var task1 = Read(client.Result);
var task2 = Write(client.Result);
while (!task1.IsCompleted && !task2.IsCompleted)
{
}
}
}
async static Task<TcpClient> Conection()
{
var ip = IPAddress.Parse("127.0.0.1");
var port = 23000;
TcpListener server = new TcpListener(ip, port);
server.Start();
var client = await server.AcceptTcpClientAsync();
return client;
}
async static Task Read(TcpClient cli)
{
var stream = cli.GetStream();
var reader = new StreamReader(stream);
char[] buff = new char[64];
await reader.ReadAsync(buff, 0, buff.Length);
string text = new string(buff);
Console.WriteLine(text);
}
async static Task Write(TcpClient cli)
{
var stream = cli.GetStream();
var writer = new StreamWriter(stream);
var message = await Task.Run(() => Console.ReadLine());
writer.WriteLine(message);
writer.Flush();
}
}
сторона клиента:
class Program
{
static void Main(string[] args)
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
var client = new TcpClient();
client.Connect(ip, 23000);
var stream = client.GetStream();
var reader = new StreamReader(stream);
var writer = new StreamWriter(stream);
while (true)
{
var task1 = Read(reader);
var task2 = Write(writer);
while(!task1.IsCompleted && !task2.IsCompleted)
{
}
}
}
async static Task Write(StreamWriter wr)
{
var str = await Task.Run(() => Console.ReadLine());
wr.Write(str);
wr.Flush();
}
async static Task Read(StreamReader reader)
{
var str = await reader.ReadLineAsync();
Console.WriteLine(str);
}
}
Он работает нормально, но когда я проверяю диспетчер задач, что-то выглядит не так, похоже, что на стороне клиента использование ОЗУ постоянно растет без остановки сразу после отправки короткого текста со стороны клиента или сервера, а использование ЦП превышает 11 % как на стороне клиента, так и на стороне сервера...
Могу ли я сделать этот код более эффективным с точки зрения использования оперативной памяти и процессора? Или я просто сделал все неправильно?
Task.WhenAll(Read(reader), Write(writer))
16.12.2020async Main
, здесь кратко объясняется: смысл иметь асинхронный Main? 16.12.2020