Il multi-threading è molto complesso. Stai tagliando e incollando il codice senza nemmeno imparare nulla sugli aspetti più basilari del threading: come iniziare un thread. Incollare qualcosa via web in un'interfaccia utente per correggere o modificare un controllo è una cosa. Questo è un processo completamente diverso. Devi studiare l'argomento, scrivere tutto il tuo codice e capire esattamente come funziona, altrimenti stai solo perdendo tempo con questo.
Un delegato è la versione .NET di un puntatore a funzione sicura. Tutti i thread richiedono un punto di ingresso per avviare l'esecuzione. Per definizione, quando viene creato un thread primario, viene sempre eseguito Main() come punto di ingresso. Qualsiasi thread aggiuntivo creato avrà bisogno di un punto di ingresso definito in modo esplicito: un puntatore alla funzione in cui dovrebbero iniziare l'esecuzione. Quindi i thread richiedono sempre un delegato.
I delegati vengono spesso utilizzati nella filettatura anche per altri scopi, principalmente i callback. Se vuoi che un thread riporti alcune informazioni come lo stato di completamento, una possibilità è creare una funzione di callback che il thread possa usare. Anche in questo caso il thread ha bisogno di un puntatore per essere in grado di eseguire la callback in modo che anche i delegati vengano utilizzati per questo. A differenza di un punto di ingresso questi sono opzionali, ma il concetto è lo stesso.
La relazione tra thread e delegati è che i thread secondari non possono semplicemente chiamare metodi come il thread dell'app principale, quindi è necessario un puntatore a funzione e i delegati fungono da puntatori a funzione.
Non si vede il delegato e non ne è stato creato uno perché il framework lo sta facendo per voi nel costruttore Thread. È possibile passare il metodo che si desidera utilizzare per avviare il thread e il codice framework crea un delegato che punta a questo metodo. Se si desidera utilizzare una richiamata, è necessario creare personalmente un delegato.
Questo è il codice senza espressioni lambda. SomeClass ha alcune elaborazioni che richiedono molto tempo e vengono eseguite sui thread in background. Per aiutare con questo il SomeThreadTask è stato creato e contiene il codice di processo e tutto il thread necessario per eseguirlo. Un secondo delegato viene utilizzato per un callback al termine del thread.
Il codice reale sarebbe più complicato e una classe reale non dovrebbe mai sapere come creare thread ecc. In modo da avere oggetti di gestione.
Innanzitutto apprezzo la tua risposta dettagliata. Mi prenderò il mio tempo per impararlo attentamente. Informazioni sulla copia e incolla ... A volte un giocatore di football che impara il suo calcio nel neibourhood e poi perfezionato da una buona squadra è meglio di uno che è cresciuto in un club. In altre parole a volte bisogna sentire qualcosa prima di capirlo. Ad ogni modo ... mi hai aiutato e ti ringrazio per questo – Asaf