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

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



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

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


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

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

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

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

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

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

Все понял.

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


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