【发布时间】: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 是我需要的,但现在我不确定了。
标签: c# multithreading tcp async-await tcpclient