0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
Task вызов08.04.2018, 21:33. Показов 2016. Ответов 14
Метки нет (Все метки)
Здравствуйте!
Сейчас разбираюсь с асинхронностью и тут встал вопрос. есть функция -
или может так ?
0
|
08.04.2018, 21:33 | |
Ответы с готовыми решениями:
14
Вызов событий из Task Task.WhenAll для разных типов Task Отмена одного Task в массиве Task Вызов методов классов друг у друга (вызов метода из другого класса) |
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
08.04.2018, 21:58 | 2 |
В первом случае запускается асинхронная операция и возвращается ссылка на объект, ее представляющий.
Во втором случае запускается асинхронная операция, которая запускает асинхронную операцию и возвращает ссылку на объект, представляющий асинхронную операцию, которая возвращает асинхронную операцию. Масло-масляное, короче. Если выбирать из двух, то первый вариант. Первый вариант. Не.
1
|
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
|
09.04.2018, 08:20 [ТС] | 3 |
Спасибо за ответ!
а есть еще лучше варианты? я только учусь был бы рад узнать
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
09.04.2018, 09:01 | 4 | |||||
Поскольку в первом варианте у вас в методе ничего кроме асинхронного ожидания не происходит, было бы логичнее просто возвращать Task, а не создавать конечный автомат, ожидающий завершения задачи (это делается при использовании конструкции await) только для того, чтобы тут же завершить работу метода:
0
|
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
|||||||||||
09.04.2018, 09:33 [ТС] | 5 | ||||||||||
а ну тут не совсем так, там у меня цикл
просто я честно даже не знаю что делать с task который создается от ClientService а сделать
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
09.04.2018, 09:40 | 6 |
На будущее: лучше все-таки для конкретного ответа выкладывать конкретный код, а не гипотетический пример
Особенно если нет четкого понимания происходящего (а его нет, иначе бы темы не было!) Разница может быть существенная, в чем вы убедитесь, дочитав ответ до конца. Вот в этом варианте я бы уже предложил запускать ClientService через Task.Run — как во втором примере, поскольку асинхронный вызов не гарантирует многопоточности, а Task.Run запускает выполнение в одном из потоков пула. Если оставить код как у вас, то возможна ситуация при которой следующий клиент не подключится до тех пор, пока не прекратится работа с последним подключившимся. Вероятность мала, но не нулевая. Не совсем по теме, но я бы так же предложил передавать CancellationToken в метода AcceptClient, а то сейчас при отмене у вас цикл не прекратится до следующего подключения клиента, которое может никогда не произойти.
2
|
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
||||||
09.04.2018, 15:02 [ТС] | 7 | |||||
Большое спасибо за советы, Вы очень помогли
Добавлено через 58 минут
Добавлено через 1 час 3 минуты блин я так понял что это сделать нельзя?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|||||||||||
10.04.2018, 10:31 | 8 | ||||||||||
Поскольку вы используете обертку над асинхронными вызовами, напрямую токен передать не получится — придется проверять после.
Люди же работают, не всегда есть время на форуме отдыхать.
1
|
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
|
10.04.2018, 17:14 [ТС] | 9 |
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
10.04.2018, 17:23 | 10 |
Да, он самый.
При отмене будет вызван метод Close на "слушателе" портов, вызов которого приведет к прерыванию асинхронного BeginAccept и выбросу исключения. Не помню точно, какое исключение бросается в этом случае: ObjectDisposedException или SocketException (поэкспериментируйте!), но это исключение отлавливается и цикл завершается.
0
|
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
||||||
10.04.2018, 17:27 [ТС] | 11 | |||||
у меня правда там нет tcpClient там просто слушаю сокет я так понимаю мне нужно вызвать socket.Close?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
10.04.2018, 17:30 | 12 | |||||
Ну да, это я имена переменных перепутал.
Должно быть так:
0
|
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
||||||
10.04.2018, 18:22 [ТС] | 13 | |||||
я очень много от Вас понял т.к. получил инфу и понял что нужно почитать Спсибо!
наверно я много прошу но может быть вы посмотрите код всего сервера и дадите еще какие нить советы? конечно если не затруднит...
я тут потестил и получается если использовать один токен отмены то данной записи достаточно чтоб отключить сервер без проблем и запись не на что не влияет ))
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
10.04.2018, 19:11 | 14 |
Плохо потестили.
Многопоточные приложения вообще не сильно поддаются тестированию. Например, если будет такая очередность инструкций: 1. Вызывается Cancel 2. Заканчивается вызов await 3. listener закрывается 4. Метод AcceptClient продолжает работать и завершает выполнение. 5. Запускается процесс считывания. По-хорошему вызов ThrowIfCancellationRequested должен быть перед return, но у вас ранее идет добавление в список, потому я добавил его сразу после завершения асинхронного метода.
0
|
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 22
|
|
10.04.2018, 19:29 [ТС] | 15 |
а ок понял))Буду рад любым замечаниям
0
|
10.04.2018, 19:29 | |
10.04.2018, 19:29 | |
Помогаю со студенческими работами здесь
15
Task не останавливается Отмена Task Отмена Task Работа с Task Задачи Task Task и исключение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |