Много раз замечал такой код:
using System.Threading;
var t = new Timer(() => {
t.Dispose();
}, ...);
Насколько правомерно такое использование ?
Не может ли быть ситуации когда t.Dispose вызовется до присваивания ?
Здравствуйте, _NN_, Вы писали:
_NN>Много раз замечал такой код:
_NN>_NN>using System.Threading;
_NN>var t = new Timer(() => {
_NN> t.Dispose();
_NN>}, ...);
_NN>
_NN>Не может ли быть ситуации когда t.Dispose вызовется до присваивания ?
Может. Именно поэтому компилятор скажет "Use of unassigned local variable 't'" на t.Dispose().
Здравствуйте, _NN_, Вы писали:
_NN>Не может ли быть ситуации когда t.Dispose вызовется до присваивания ?
Nikov ответил выше, дополню.
При некоторых условиях GC может пожрать таймер ещё до вызова каллбэков. Например, если переменная t нигде не используется и задан непустой dueTime.
Тут ещё есть оччень милый недокументированный нюанс из разряда "знать бы раньше": таймер использует объект state, переданный в конструктор в качестве gc root. Т.е. пока state жив, таймер будет работать, пока его не остановят вручную.
Пруф,
ещё один. Тёмное наследие первого фреймворка, даа.
С System.Timers.Timer тоже не всё очевидно. Смотрим последний абзац по первой из ссылок выше.
Summary (полувсерьёз): используйте Task.Delay()
Здравствуйте, nikov, Вы писали:
Пардон.
Имелось ввиду конечно:
using System.Threading;
Timer t = null;
t = new Timer(() => {
t.Dispose();
}, ...);