如何实现多线程服务器请求? 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#的主要内容,如果未能解决你的问题,请参考以下文章