3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
||||||
1 | ||||||
Многопоточный запрос у сервера30.09.2021, 22:23. Показов 2991. Ответов 21
Всем здравствуйте! Нужна помощь в состыковке всех методов. Я взял тестовое задание на вакансию c# программиста, просто, чтобы поработать с настоящим заданием, на саму вакансию не претендую.
Задание звучит так: По tcp\ip подключиться к серверу и отправить на него стрингом число от 1 до, условно, 500. На каждое присланное число сервер присылает целое число в диапазоне от 0 до 1е7 и по бокам от этого числа еще всякий мусор, символы там, точки. Нужно получить все числа и вычислить медиану. Проблема в том, что каждое число сервер присылает с задержкой. Я, в целом, сделал всё, кроме многопоточности. Я пытаюсь реализовать это через async-await, но понимаю, что опыта мало, потому обращаюсь к вам. Как мне одновременно запрашивать несколько таких чисел у сервера с их последующей обработкой? Общую схему вижу такую: 5 асинк методов, которые отправляю числа от 1 до 500, каждый отвечает за свой диапазон чисел. Скажем, первый метод в цикле for отправляет числа от 1 до 100, второй от 101 до 200 и так далее. Каждое полученное число фильтруется через регулярные выражения, где отрезается весь мусор по бокам, само число конвертируется в инт и отправляется в общий массив. После выполнения всех 5 методов с их циклами уже в Мэйне весь массив сортируется и вычисляется медиана, так же все числа массива записываются в файл, но это уже чисто для меня. Я понимаю, что скорее всего что-то упускаю, потому прошу, не откажите, покажите верный путь. Мой код кидает эксепшн: "Unable to read data from the transport connection: Программа на вашем хост-компьютере разорвала установленное подключение..." Прикладываю код:
0
|
30.09.2021, 22:23 | |
Ответы с готовыми решениями:
21
Многопоточный пост запрос При каких сценариях можно увидеть различия в следующих реализациях сервера: однопоточный, многопоточный Не отправляется запрос с сервера POST запрос на Api сервера |
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
||||||
01.10.2021, 13:47 [ТС] | 2 | |||||
Удалось немного сдвинуться с места. Сейчас не понимаю, почему при выполнение задачи, я от сервера получаю стринг кусками то количество раз, сколько работает цикл. То есть, отправить еще какое-то число не удается.
Вот результат в консоли: Когда выполняю цикл один раз: Код
Число под номером 3:8161576 .........8161576... .. ...... Код
Число под номером 4:8633 ..8633.... . Число под номером 4:123 ..123.. . . By the Holy Light! Unrecognized input line. Please check input string.
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
||||||
01.10.2021, 22:16 [ТС] | 3 | |||||
Следующий шаг в выполнении задачи:
Смог сделать, вроде бы, многопоточные запросы, для начала сделал 3 метода, каждый запрашивает по 10 цифр. Столкнулся с тем, что иногда вылетает экспешн и я не знаю как его обработать, чтобы код продолжал выполняться.
Код
System.ArgumentOutOfRangeException: 'Specified argument was out of the range of valid values. Arg_ParamName_Name' на строке метода такой: int result = Convert.ToInt32(match[0].Value);
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
||||||
01.10.2021, 23:38 | 4 | |||||
Значит этого элемента нет match[0]
Добавлено через 3 минуты Добавьте
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
|
01.10.2021, 23:53 [ТС] | 5 |
ipsorokin, это скорее всего происходит, потому что по каким-то причинам сервер не дает цифру в ответ на запрос. Как я понял, мне нужно обработать этот эксепшн так, что если он случается, он должен ту же цифру запросить еще раз.
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
||||||
02.10.2021, 15:55 [ТС] | 6 | |||||
Окей, двигаемся по-тихоньку. Новая проблема: стринг ответа от сервера иногда приходит в обрезанном виде, то есть я получаю не целое число 76478347, а 764. Это происходит рандомно и я не знаю почему. Может быть буфер переполняется и новая информация обрезается?
Известно, что ответ от сервера приходит в виде стринга с числом посередине, с символом line feeder в конце и с любым количеством мусора по бокам от числа. Я все это дело фильтрую через регулярку, чтобы получить число, но иногда приходит неполный стринг и я не знаю, как это обрабатывать.
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
|||||||||||
02.10.2021, 21:36 | 7 | ||||||||||
Сообщение было отмечено magrega как решение
Решение
Оно?
1
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
|
02.10.2021, 21:49 [ТС] | 8 |
Похоже на то, тестирую, возвращаются ли нормальные стринги. Почему оно так быстро запросы делает? У меня гораздо медленнее работает.
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
|
02.10.2021, 21:56 | 9 |
Сервер ждёт подключение. После того как клиент подключается, он сразу передает его в другой поток и ждет следующее подключение.
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
||||||
02.10.2021, 22:05 [ТС] | 10 | |||||
Ну вот тут видно, что стринг какой-то кривой прилетает. Сервер не мой, к сожалению.
Код
=> . => .. .. => .. ... 8161576 => .. 8161576........ 8120765 => .....8120765. . . 8161149 => ...... .8161149.... 8233714 => .......8233714.... 8128541 => .. ...8128541. .. 8113652 => ....8113652.. ... 8120765 => .. .8120765.. ...... 8233714 => ....8233714. .. 8233714 => .... 8233714... ... 8161149 => .. . ........8161149. . . 8120765 => ... 8120765........ .. 8161149 => ....... ... 8161149.. 8161306 => ... 8161306 ........ . 8113652 => .. ....8113652 ..... .. 8161149 => ..... ... .8161149 .... 8161576 => . .. .....8161576.. .. . 8127334 => ... .... .....8127334. . .... ..... ipsorokin, очень интересно понять, что вот тут происходит:
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
||||||
02.10.2021, 22:11 | 11 | |||||
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
|
02.10.2021, 22:19 [ТС] | 12 |
ipsorokin, Даже с вашим замечательно придуманным кодом я ловлю эти корявые стринги. Я очень хочу понять в чем дело. Может быть дело на сервере, но я не могу это проверить.
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
||||||
02.10.2021, 22:26 | 13 | |||||
Ну как я понял из этого
Код
=> . => .. .. => .. ... 8161576 => .. 8161576........ 8120765 => .....8120765. . . 8161149 => ...... .8161149.... 8233714 => .......8233714.... 8128541 => .. ...8128541. .. 8113652 => ....8113652.. ... 8120765 => .. .8120765.. ...... 8233714 => ....8233714. .. 8233714 => .... 8233714... ... 8161149 => .. . ........8161149. . . 8120765 => ... 8120765........ .. 8161149 => ....... ... 8161149.. 8161306 => ... 8161306 ........ . 8113652 => .. ....8113652 ..... .. 8161149 => ..... ... .8161149 .... 8161576 => . .. .....8161576.. .. . 8127334 => ... .... .....8127334. . .... ..... Добавлено через 1 минуту
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
|
02.10.2021, 22:29 [ТС] | 14 |
ipsorokin, проблема в том, что иногда в эти покромсанные стринги попадает часть числа, и тогда число какое-то становится неправильным.
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
|
02.10.2021, 22:31 | 15 |
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
|
02.10.2021, 22:52 [ТС] | 16 |
ipsorokin, ну вот я многократно отправил число 21. В начале видно, что есть лишь кусок этого числа - 407. И такое бывает не в начале потока запросов, это может случиться в любой момент.
Код
Number 21: => ....... Number 21: 407 => .. .407 Number 21: => ..... Number 21: 4077718 => .. .. .4077718.. . Number 21: 4077718 => ...... . . ..4077718.. Number 21: 4077718 => .....4077718. .. Number 21: 4077718 => .. ....4077718.. .... Number 21: 4077718 => ....4077718... ..... Number 21: 4077718 => ... ... .4077718. . Number 21: 4077718 => .. .... . .4077718 .. .... Number 21: 4077718 => . ......4077718.... .. Number 21: 4077718 => ...... .....4077718.. . Number 21: 4077718 => . ... ... ..4077718 . .. . .. Number 21: 4077718 => . ..... .. .4077718 Number 21: 4077718 => ........4077718...... . Number 21: 4077718 => ..... 4077718... .. . . Number 21: 4077718 => ..... .4077718....... .... Number 21: 4077718 => .... ..4077718....... ... . Number 21: 4077718 => .. ... ...4077718. .. . .... Number 21: 4077718 => . ... . ..... 4077718.... ......
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
||||||
03.10.2021, 12:11 [ТС] | 17 | |||||
ipsorokin, я немного адаптировал ваш код и сейчас не могу понять, почему я не вижу все цифры в консоли, а некоторые еще и повторяются. Здесь я по сути каждый раз инкрементируя number, посылаю на сервер числа от 1 до 20, но в консоли это:
Код
=> .. .... => ........ .. 5094429 => ... .5094429 5094429 => . ......5094429 . . 5 => . .... .5 5094429 => .....5094429 ..... 5094429 => .... .. ... 5094429.. 5094429 => ....5094429........ 5094429 => .... 5094429.... ... 5094429 => .. ... .. .5094429... .. 5094429 => ... ......... 5094429. .. .. 5094429 => .. .. ...5094429 .. ... .. 5094429 => ........... .5094429 ...... 5094429 => ...........5094429 ..... 5094429 => ..... ........5094429... . . 5094429 => ... ... .. ..5094429....... ... 5094429 => . ..... . . .5094429... ..... .. 5094429 => .. .. .5094429.. . . 5094429 => .........5094429.. .. ....... 5094429 => ...... .... .5094429... . .... .
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
|
03.10.2021, 12:53 | 18 |
Откуда ж мне знать, что там за сервер такой и почему шлет одно и то же число.
0
|
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
|
|
03.10.2021, 13:13 [ТС] | 19 |
ipsorokin, Извините, что донимаю, просто интересно докопаться до истины. Мне кажется, что просто до того, как сервер начинает отвечать, цикл уже доходит до i = 20. Я знаю точно, что ответ на цифру 20 должен быть 5094429, и этим же числом у меня завершается цикл. Я пробовал устанавливать Task.Delay внутри while-цикла, но задержки не происходит.
0
|
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
|
|
03.10.2021, 13:18 | 20 |
magrega, ну воткните её до того как собираетесь читать
var strR = sr.ReadLine(); .
может await забыли.
0
|
03.10.2021, 13:18 | |
03.10.2021, 13:18 | |
Помогаю со студенческими работами здесь
20
Отправка-запрос файла с сервера Отправить запрос с сервера клиенту Ответ сервера на запрос микроконтроллера. Ответ сервера UDP на запрос Запрос с другого сервера и php json запрос с сервера на localhost Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |