Я недавно искал эту проблему, посмотрев некоторые примеры реализации Task.Delay и сделав некоторые эксперименты.
Оказывается, независимо от того, является ли System.Threading.Timer GCd, зависит от того, как вы постройте его !!!
Если построено только с обратным вызовом, то объект состояния будет сам таймер, и это предотвратит его GC'd. Это, кажется, нигде не документировано, но без него чрезвычайно сложно создать огонь и забыть таймеры.
Я нашел это из кода в http://www.dotnetframework.org/ default.aspx / DotNET / DotNET / 8 @ 0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Threading / Timer @ cs / 1 / Timer @ cs
Комментарии в этом коде также указывают, почему всегда лучше использовать callback-only ctor, если обратный вызов ссылается на объект таймера, возвращаемый новым, поскольку в противном случае может быть ошибка гонки.