Dzisiaj bardzo krótka notka, mająca na celu przestrzec przed modyfikacją jakichkolwiek właściwości wątku, który pochodzi z puli. Bardzo łatwo zmienić jego stan poprzez ustawienie nowego priorytetu albo zmianę kultury. Inny przykład to TLS o którym już pisałem na blogu. Dlaczego jest to tak złe?
private void Run() { Thread.CurrentThread.Priority = ThreadPriority.Highest; }
Musimy zdać sobie sprawę, że takowe wątki wyłącznie wypożyczamy. Ktoś na forum porównał to do wypożyczalni samochodów. Gdy wypożyczamy samochód nie możemy go przemalować i potem zwrócić jakby nic nie stało się. Podobnie jest z wątkami. Za kilka sekund może on wykonywać kompletnie inną logikę, niezależną od nas.
Błędy powstałe przez łamanie tej zasady są bardzo trudne w znalezieniu – zależą od historii callback’ow wykonanych przez dany wątek. Jeśli na produkcji pojawi się takowy problem będzie to bardzo mozolne poszukiwanie przyczyny.
Implementacja CLR zapewnia, że nazwa wątku, priorytet, typ (IsBackground) są zawsze resetowane po zwróceniu go z powrotem do puli. Mimo to, uważam, że nie powinniśmy na tym polegać i nigdy nie powinniśmy modyfikować stanu wątku, nawet w .NET (dla programistów WinApi jest to niekwestionowana zasada). Pomimo, że CLR zawiera kilka udoskonaleń to i tak nie zresetuje stanu TLS ponieważ jest to zbyt bardzo czasochłonne. Z tego wynika, że lepiej nie ryzykować i nie zmieniać stanu – nie zawsze wiemy co jest resetowane w aktualnej wersji .NET.