Как реализовать многопоточный запрос сервера? C#

#c# #multithreading #tcp #async-await #tcpclient

Вопрос:

каждый. Прежде чем я перейду к этому, я хотел бы сказать, что я довольно новичок в C#, но я делаю все возможное. Прямо сейчас в качестве вызова для себя я взял тестовое задание от ИТ-компании только для lulz, я не собираюсь претендовать на эту работу, мне просто было любопытно, как будет выглядеть задача в реальной жизни.

В принципе, то, что мне нужно сделать, это: есть сервер. Мне нужно установить соединение tcpip, отправить определенную строку, получить обратно строку с символами и числами, отфильтровать и преобразовать эти числа в int, поместить все int в массив и вычислить медиану. Мне удалось выяснить все это, за исключением многопоточного запроса с сервера.

Загвоздка в том, что, когда я запрашиваю номер, возникает задержка в 30 с чем-то секунд, поэтому получение этих номеров по одному занимает кропотливо много времени.

Вот мой код:

 static int[] numList = new int[2018];
private const int port = port;
private const string server = "Ip";
static TcpClient client = new TcpClient();

static void Main(string[] args)
{
    client.Connect(server, port);
    request2();

    foreach (var item in numList)
    {
        File.AppendAllText("FileONE.txt", item.ToString());
    }

    // Закрываем потоки
    client.Close();       
   
    Console.WriteLine("Запрос завершен...");
    Console.ReadKey();
}
 
 public async static void request2()
{
    for (int i = 1; i <= 2018; i =5)
    {
        await Task.Run(() =>
        {
            //sending a string
            NetworkStream streamSend = client.GetStream();
            StreamWriter writer = new StreamWriter(streamSend);
            writer.WriteLine(i.ToString()   "n");
            writer.Flush();

            //getting a string
            NetworkStream stream = client.GetStream();
            StreamReader reader = new StreamReader(stream);
            string message = reader.ReadLine();

            //filtering out
            string regex = message;
            string pattern = @"d ";
            Regex rg = new Regex(pattern);
            MatchCollection match = rg.Matches(regex);

            int result = Convert.ToInt32(match[0].Value);
            Console.WriteLine(result);

            numList[i] = resu<
       });
    }
}        
 

Я знаю, что неправильно вызываю асинхронный метод, поэтому возникает вопрос: как я могу заставить свое приложение выполнять одновременные запросы, фильтровать необходимые данные и хранить их в массиве?

Я вижу это так: 5 асинхронных методов получают эти числа и сохраняют их в массиве, в основном я сортирую массив и вычисляю медиану. Можете ли вы направить меня в правильном направлении, чтобы сделать асинхронную вещь правильной?

Комментарии:

1. к вашему сведению async != multithreading

2. Это хороший комментарий, спасибо.

3. Вы можете проверить блог Стивена Клири на предмет асинхронного программирования на C#, это очень полезно

4. Вы думали начать с 30 заданий и задач? когда все они, чтобы вы быстрее набирали свои номера?

5. Нет, не совсем, я был зациклен на идее, что асинхронное ожидание-это то, что мне нужно, но теперь я не уверен.

Ответ №1:

Мне удалось добиться желаемой работы, написав этот код:

  static void Main(string[] args)
    {

        var tasks = new[]
        {
            Task.Factory.StartNew(() => Request1(1,10)),
            Task.Factory.StartNew(() => Request1(11,20)),
           
    };
        Task.WaitAll(tasks);
        

        Console.WriteLine("Request complete...");
        Console.ReadKey();

    }

    public static void Request1(int start, int end)
    {
        
        for (int i = start; i <= end; i  )
        {
            try
            {
                //отправление сообщения
                TcpClient client = new TcpClient();
                client.Connect(server, port);
                NetworkStream streamSend = client.GetStream();
                StreamWriter writer = new StreamWriter(streamSend);
                string request = i.ToString()   "n";
                writer.WriteLine(request);
                writer.Flush();

                //прием сообщения
                NetworkStream stream = client.GetStream();
                StreamReader reader = new StreamReader(stream);
                string message = reader.ReadLine();

                //обрабатываем строку
                string regex = message;
                string pattern = @"d ";
                Regex rg = new Regex(pattern);
                MatchCollection match = rg.Matches(regex);
                //Console.WriteLine(regex);
                int result = Convert.ToInt32(match[0].Value);
                Console.WriteLine("Number "   i   ": "   result);
                numList[i] = resu<
                File.AppendAllText("File2.txt", "Number "   i   ": "   result   "n");
                
                reader.Close();
                writer.Close();
                client.Close();
            }

            catch
            {
                Console.WriteLine("Error in number "   i   ". Retrying...");
                i--;

            }
        }
                 
    }