Pentru că puteți ajunge ușor la un impas (printre altele).
De exemplu, firul dvs. secundar ar putea încerca să actualizeze controlul UI, dar controlul UI va aștepta o resursă blocată de firul secundar care urmează să fie eliberat, astfel încât ambele fire ajung să aștepte unul pe celălalt să termine. După cum au comentat alții, această situație nu este unică pentru codul UI, ci este deosebit de comună.
În alte limbi, cum ar fi C ++, sunteți liberi să încercați să faceți acest lucru (fără a fi aruncată o excepție ca în WinForms), dar aplicația dvs. poate îngheța și nu mai răspunde dacă apare un blocaj.
De altfel, puteți spune cu ușurință că firul UI doriți să actualizați un control, trebuie doar să creați un delegat, apoi să apelați metoda (asincronă) BeginInvoke pe acel control prin care îl transmiteți delegatului. De exemplu.
myControl.BeginInvoke(myControl.UpdateFunction);
Aceasta este echivalentă cu a face un C ++/MFC PostMessage dintr-un thread lucrător