|
Объясните пожалуйста новичку эту конструкцию.
|
|||
---|---|---|---|
#18+
Привет. Не могу понять, как работает данная конструкция: Код: c# 1. 2.
Я могу понять "что делает" этот код. Полагаю, что using вызывается после того, как делегат сработает, первый и единственный раз, - т.е. фактически делегат после выполнения сможет почистить память за собой. Вот понимаю конструкцию такого вида: Код: c# 1. 2.
Когда поток управления дойдет до закрывающей скобки, будет вызван Dispose. Все просто и линейно. А в сложном варианте я не понимаю КОГДА и ПОЧЕМУ должен сработать Dispose у делегата, который возвращается методом Register. Объясните пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 16:55 |
|
Объясните пожалуйста новичку эту конструкцию.
|
|||
---|---|---|---|
#18+
Так есть у кого идеи, как работает эта магия ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 11:15 |
|
Объясните пожалуйста новичку эту конструкцию.
|
|||
---|---|---|---|
#18+
Что не понятного то? Компилятор заведет переменную до блока try, попытается инициализировать в блоке try и попытается вызвать диспоз в fimally, если она не null. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 11:41 |
|
Объясните пожалуйста новичку эту конструкцию.
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Начал формулировать уточняющие вопросы к вам, и... понял где ошибся :) Я думал, что регистрация этого делегата происходит как,например, регистрация обработчика кнопки на форме. После чего программа выполняется неопределенно долго - и в какой-то момент может сработать этот обработчик. Я думал "ой, но ведь мы уже не в try finally находимся. Почему должен сработать finally, если его нет ?" (т.е. откуда вокруг обработчика кнопки будет блок try finally). Понял свою ошибку. Управление никуда не выходит за пределы этой функции ! Мы ожидаем выполнения tcs.Task, после чего и срабатывает finally, который вызывает Dispose. Все понял. PS. В процессе изучения вопроса узнал, что есть такая штука как "IDispose abusing". Когда IDispose используют не только для обычной отчистки ресурсов, но и для того, чтобы гарантированно выполнить некую работу. Какую угодно. В данном случае для де-регистрации колбека делегата, а не для отчистки ресурсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 12:10 |
|
Объясните пожалуйста новичку эту конструкцию.
|
|||
---|---|---|---|
#18+
ProBiotekPS. В процессе изучения вопроса узнал, что есть такая штука как "IDispose abusing". Когда IDispose используют не только для обычной отчистки ресурсов, но и для того, чтобы гарантированно выполнить некую работу. Какую угодно. В данном случае для де-регистрации колбека делегата, а не для отчистки ресурсов. https://msdn.microsoft.com/ru-ru/library/dd782981(v=vs.100).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 12:23 |
|
Объясните пожалуйста новичку эту конструкцию.
|
|||
---|---|---|---|
#18+
Оператор await использует класс SynchronizationContext для возврата в исходный поток после завершения работы в потоке (потоках), соответствующих экземпляру класса Task. Если у потока нет SynchronizationContext, то выполнение продолжается в том ж потоке (аналогично можно задать функцией ConfigureAwait), но продолжение всё равно последует после завершения потока (потоков), соответствующих экземпляру класса Task. Хотя этот код похож на какой-то костыль. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 12:34 |
|
|
start [/forum/topic.php?fid=20&msg=39179734&tid=1400775]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 131ms |
0 / 0 |