powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Объясните пожалуйста новичку эту конструкцию.
7 сообщений из 7, страница 1 из 1
Объясните пожалуйста новичку эту конструкцию.
    #39179130
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.
Не могу понять, как работает данная конструкция:

Код: c#
1.
2.
using (cancellationToken.Register(() => tcs.TrySetCancelled()))   
    await tcs.Task;



Я могу понять "что делает" этот код. Полагаю, что using вызывается после того, как делегат сработает, первый и единственный раз, - т.е. фактически делегат после выполнения сможет почистить память за собой.

Вот понимаю конструкцию такого вида:
Код: c#
1.
2.
using (.....)	
{}


Когда поток управления дойдет до закрывающей скобки, будет вызван Dispose. Все просто и линейно.

А в сложном варианте я не понимаю КОГДА и ПОЧЕМУ должен сработать Dispose у делегата, который возвращается методом Register.

Объясните пожалуйста.
...
Рейтинг: 0 / 0
Объясните пожалуйста новичку эту конструкцию.
    #39179593
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так есть у кого идеи, как работает эта магия ?
...
Рейтинг: 0 / 0
Объясните пожалуйста новичку эту конструкцию.
    #39179622
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что не понятного то?
Компилятор заведет переменную до блока try, попытается инициализировать в блоке try и попытается вызвать диспоз в fimally, если она не null.
...
Рейтинг: 0 / 0
Объясните пожалуйста новичку эту конструкцию.
    #39179670
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Начал формулировать уточняющие вопросы к вам, и... понял где ошибся :)

Я думал, что регистрация этого делегата происходит как,например, регистрация обработчика кнопки на форме.
После чего программа выполняется неопределенно долго - и в какой-то момент может сработать этот обработчик. Я думал "ой, но ведь мы уже не в try finally находимся. Почему должен сработать finally, если его нет ?" (т.е. откуда вокруг обработчика кнопки будет блок try finally).

Понял свою ошибку. Управление никуда не выходит за пределы этой функции !
Мы ожидаем выполнения tcs.Task, после чего и срабатывает finally, который вызывает Dispose.

Все понял.

PS. В процессе изучения вопроса узнал, что есть такая штука как "IDispose abusing". Когда IDispose используют не только для обычной отчистки ресурсов, но и для того, чтобы гарантированно выполнить некую работу. Какую угодно. В данном случае для де-регистрации колбека делегата, а не для отчистки ресурсов.
...
Рейтинг: 0 / 0
Объясните пожалуйста новичку эту конструкцию.
    #39179695
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekPS. В процессе изучения вопроса узнал, что есть такая штука как "IDispose abusing". Когда IDispose используют не только для обычной отчистки ресурсов, но и для того, чтобы гарантированно выполнить некую работу. Какую угодно. В данном случае для де-регистрации колбека делегата, а не для отчистки ресурсов.
https://msdn.microsoft.com/ru-ru/library/dd782981(v=vs.100).aspx
...
Рейтинг: 0 / 0
Объясните пожалуйста новичку эту конструкцию.
    #39179710
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оператор await использует класс SynchronizationContext для возврата в исходный поток после завершения работы в потоке (потоках), соответствующих экземпляру класса Task. Если у потока нет SynchronizationContext, то выполнение продолжается в том ж потоке (аналогично можно задать функцией ConfigureAwait), но продолжение всё равно последует после завершения потока (потоков), соответствующих экземпляру класса Task. Хотя этот код похож на какой-то костыль.
...
Рейтинг: 0 / 0
Объясните пожалуйста новичку эту конструкцию.
    #39179734
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Объясните пожалуйста новичку эту конструкцию.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]