如何实现多线程服务器请求? C#

Posted

技术标签:

【中文标题】如何实现多线程服务器请求? C#【英文标题】:How to implement multithread server request? C# 【发布时间】:2021-11-22 14:43:54 【问题描述】:

每个人。在我进入这个之前,我想说我对 C# 相当陌生,但我正在尽力而为。现在作为对自己的挑战,我从一家 IT 公司为 lulz 接受了一项测试任务,我不会接受这份工作,我只是好奇现实生活中的任务会是什么样子。

基本上,我需要做的是:有一个服务器。我需要建立 tcp\ip 连接,发送某个字符串,返回一个带有符号和数字的字符串,过滤掉这些数字并将其转换为 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] = result;
       );
    
        

我知道我错误地调用了异步方法,所以这是一个问题:如何让我的应用同时发出请求、过滤所需的数据并存储在数组中?

我是这样看的:5 个异步方法获取这些数字并将它们存储在数组中,在 Main 中我对数组进行排序并计算中间值。你能引导我朝着正确的方向前进吗?

【问题讨论】:

仅供参考async != multithreading 这是一个很好的评论,谢谢。 你可以查看 Stephen Cleary 的博客了解 C# 异步编程,非常有帮助 您是否考虑开始 30 个任务和 task.whenall 以便您更快地获得数字? 不,不是真的,我一直认为 async-await 是我需要的,但现在我不确定了。 【参考方案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] = result;
                File.AppendAllText("File2.txt", "Number " + i + ": " + result + "\n");
                
                reader.Close();
                writer.Close();
                client.Close();
            

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

            
        
                 
    

【讨论】:

以上是关于如何实现多线程服务器请求? C#的主要内容,如果未能解决你的问题,请参考以下文章

C# Winform 多线程 SOCKET 文件上传,下载

linux C 线程池

c语言实现多线程

c语言 多线程套接字编程

Python笔记Python多线程进程如何正确响应Ctrl-C以实现优雅退出

Python笔记Python多线程进程如何正确响应Ctrl-C以实现优雅退出