Văd o mulțime de oameni în posturi pe blog și aici, pe DECI, fie evitarea sau consilierea împotriva utilizare de "Subiect" de clasă în versiunile recente ale C# (și mă refer desigur 4.0+, cu adaos de "Sarcină" & prieteni). Chiar și înainte, au fost dezbateri despre faptul că un simplu vechi thread's funcționalitate poate fi înlocuit în multe cazuri de `ThreadPool-o clasă.
De asemenea, alte mecanisme specializate sunt, în continuare, făcând "Subiect" de clasă mai puțin atrăgătoare, cum ar fi Cronometrul este înlocuirea urât "Subiect" + "Sleep" combo, în timp ce pentru Gui avem BackgroundWorker`, etc.
Totuși, "Subiect" pare să rămână un concept foarte familiar pentru unii oameni (inclusiv eu), oameni care, atunci când se confruntă cu o sarcină care implică un fel de execuție în paralel, sari direct la utilizarea bun vechi "Subiect" de clasă. Am'am fost întrebat în ultima vreme dacă-l's timp pentru a modifica căile mele.
Deci, întrebarea mea este, sunt cazuri când l's este necesar sau util de a folosi un simplu vechi "Subiect" obiect în loc de una de mai sus constructe?
Firul de clasă nu pot fi depășite pentru că, evident, este o implementarea detaliu de toate celelalte modele le-ai mentionat.
Dar asta'nu e chiar întrebarea ta; întrebarea ta este
există cazuri când l's este necesar sau util de a folosi un simplu obiect Fir în loc de una de mai sus constructe?
Sigur. Tocmai în acele cazuri în care una dintre cele mai mari la nivel de constructe nu satisface nevoile dumneavoastra.
Sfatul meu este că, dacă te afli într-o situație unde existente superior de abstractizare instrumente nu satisface nevoile dvs., și vă doresc să pună în aplicare o soluție folosind fire, atunci ar trebui să identificarea lipsă de abstractizare care ai nevoie, apoi să pună în aplicare care abstractizare folosind fire, apoi utilizați abstractizare.
Firele sunt un bloc de construcție de bază pentru anumite lucruri (și anume paralelism și asincrone) și, astfel, nu ar trebui să fie luat. Cu toate acestea, pentru cele mai multe persoane și mai cazuri de utilizare sunt mai multe lucruri pentru a utiliza în care le-ați menționat, astfel ca firul de piscine (care oferă un mod frumos de manipulare multe locuri de muncă mici, în paralel, fără supraîncărcarea aparatului de reproducere 2000 de fire dintr-o dată), BackgroundWorker
(care încapsulează evenimente utile pentru o singură scurtă bucată de munca).
Dar doar pentru că, în multe cazuri, acestea sunt mai adecvate ca au scut programator de inutil reinventeze roata, face greșeli stupide și cum ar fi, asta nu înseamnă că Firul de clasă este învechit. Acesta este încă folosit de către abstracții numit mai sus și ai încă nevoie de ea, dacă aveți nevoie de un control cu granulatie fina peste fire, care nu este acoperită de mai multe clase speciale.
În mod similar, .NET
nu't interzic utilizarea de tablouri, în ciuda Listă
"Sarcină" și "Subiect" sunt diferite abstracții. Dacă doriți pentru a modela un fir, "Subiect" clasa este încă cea mai potrivită alegere. E. g. dacă aveți nevoie pentru a interacționa cu fir de curent, nu't vedea mai bine tipuri de acest lucru.
Cu toate acestea, așa cum ați subliniat .NET a adăugat mai multe dedicat abstracții care sunt de preferat față de "Subiect" în multe cazuri.
La "Subiect" clasa nu este depășită, este încă util în situații speciale.
Unde lucrez eu am scris-o 'fundal procesor', ca parte a unui sistem de management de conținut: un serviciu Windows care monitorizează directoare, adrese de e-mail și RSS feed-uri, și de fiecare dată ceva nou apare executa o sarcină pe ea - de obicei, pentru a importa datele.
Încercările de a folosi thread pool pentru acest lucru nu au de lucru: încearcă să execute prea multe lucruri în același timp și gunoi de discuri, așa că am pus în aplicare propria noastră votare și a sistemului de execuție folosind direct la "Subiect" de clasă.
Noile opțiuni de a face direct utilizarea și gestionarea (scump) fire mai puțin frecvente.
oameni care, atunci când se confruntă cu o sarcină care implică un fel de execuție în paralel, sari direct la utilizarea bun Thread vechi de clasă.
Care este un foarte scumpe și relativ complex mod de a face lucruri în paralel.
Rețineți că detrimentul cel mai important: nu puteți utiliza un fir plin pentru a face un loc de muncă mic, ar fi contraproductiv. La ThreadPool combate costurile, clasa de Sarcini complexitatea (excepții, de așteptare și de anulare).
Pentru a răspunde la întrebarea "există cazuri când l's este necesar sau util de a folosi un simplu obiect Fir", am'd spune un simplu Fir este util (dar nu necesar), atunci când aveți un timp de funcționare proces care ai câștigat-o't vreodată de a interacționa cu un alt fir.
De exemplu, dacă're scris o aplicație care subscrie pentru a primi mesaje de la un fel de coadă de mesaje și te're aplicație este de gând să facă mai mult decât doar a procesa aceste mesaje atunci ar fi util de a folosi un Fir pentru ca firul va fi de sine-stătătoare (de exemplu, nu't de așteptare pe ea pentru a obține făcut), și nu este't de scurtă durată. Folosind ThreadPool-class este mai mult de așteptare pentru o grămadă de scurtă durată obiecte de lucru și care să permită ThreadPool clasa a gestiona în mod eficient de prelucrare pe fiecare în parte ca un Thread nou este disponibil. Sarcinile pot fi utilizate în cazul în care ar folosi Fir direct, dar în scenariul de mai sus nu't cred că ar câștiga prea mult. Ele vă ajuta să interacționeze cu fir mai ușor (care scenariul de mai sus nu't nevoie) și de a le ajuta să determina cât de multe Fire de fapt ar trebui să fie utilizate pentru un anumit set de sarcini în funcție de numărul de procesoare trebuie (ceea ce e't ceea ce vrei, așa că'd spune-Sarcina ta de lucru este LongRunning caz în care în actualul 4.0 punerea în aplicare ar crea pur și simplu un separată non-centralizate Fir).
Probabil nu e raspunsul care il asteptai, dar eu folosesc Fir tot timpul atunci când codificare împotriva .NET Micro Framework. MF este destul de tăiat și nu't includ mai mare nivel de abstracții și Firul de clasă este foarte flexibil atunci când aveți nevoie pentru a obține ultimul strop de performanta dintr-un low MHz CPU.
L's nu s-a învechit.
Problema cu multithreaded aplicații este că acestea sunt foarte greu de gasit (de multe ori indeterministic comportament, de intrare, de ieșire și, de asemenea, de stat interne este important), deci un programator ar trebui să împingă cât de multă muncă este posibil să-cadru/instrumente. Rezumat departe. Dar, dușmanul de moarte al abstractizare este performanta.
Deci, întrebarea mea este, sunt cazuri când l's necesare sau utile pentru a utiliza un simplu Thread vechi obiect în loc de unul de mai sus construiește?
Am'd du-te cu Fire și se blochează doar dacă va exista grave probleme de performanță, de înaltă performanță obiective.
Am'am folosit mereu Firul de clasă, atunci când am nevoie de a păstra numărul și controlul fire am'am spus-o. Mi-am dat seama că pot folosi threadpool să dețină toate deosebite de muncă, dar nu'am mai găsit o modalitate bună de a urmări cât de multă muncă este în curs de făcut sau ce stare este.
În schimb, am crea o colecție și locul fire într-o după ce am spin-le - ultimul lucru de care un subiect nu este de a elimina din colectie. În acest fel, pot spune întotdeauna cât de multe fire se execută, și pot folosi de colectare să vă întreb pe fiecare ce-l's fac. Dacă nu's un caz când am nevoie pentru a ucide-le pe toate, în mod normal,'d trebuie să stabilească un fel de "Anulați" pavilion în cererea dumneavoastră, așteptați pentru fiecare fir pentru a observa că pe cont propriu și auto-termina - in cazul meu, pot să merg colectarea și emite un Fir.Abandona la fiecare la rândul său.
În acest caz, nu am't a găsit o cale mai bună, care lucrează direct cu Firul de clasă. Ca Eric Lippert menționat, altele sunt doar de nivel superior, abstracții, și-l's potrivit pentru a lucra cu cel mai mic nivel de clase, atunci când disponibil la nivel înalt implementări don't satisface nevoia ta. Doar ca uneori ai nevoie pentru a face Win32 API apeluri atunci când .NET nu't adresa nevoile dvs. exacte, întotdeauna vor exista cazuri în care Firul de clasă este cea mai bună alegere în ciuda recente "progresele."
Ai putea compara Fir din clasa sa ADO.NET. L's nu este recomandat instrument pentru a face treaba, dar nu învechit. Alte instrumente de a construi pe partea de sus a acesteia pentru a ușura treaba.
Nu e greșit să utilizați Firul de clasă față de alte lucruri, mai ales dacă aceste lucruri nu't oferi o funcționalitate de care ai nevoie.