#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--;
}
}
}