Ho un'applicazione in cui desidero che più thread legga un elenco. Voglio aggiornare periodicamente la lista con i nuovi dati. Quando la lista viene aggiornata, immagino di poter creare una nuova lista e sostituirla con quella vecchia. Esempio:C# È necessario il blocco durante lo scambio di riferimenti variabili nell'applicazione multithreading
private List<string> _list = new List<string>();
private void UpdateList()
{
var newList = new List<string>(QueryList(...));
_list = newList;
}
private void ThreadRun()
{
foreach (var item in _list)
{
// process item...
}
}
Nel metodo UpdateList, un nuovo elenco viene creato e il riferimento _list viene scambiato con il nuovo elenco. Dal mio pensiero, qualsiasi thread esistente manterrà ancora il riferimento alla vecchia lista (che è OK per me), ogni nuovo thread prenderà la nuova lista. Alla fine, tutti i thread terminano e alla fine il vecchio elenco verrà raccolto. C'è qualche blocco richiesto in questo codice, o c'è qualcosa di cui mi devo occupare per garantire un accesso multi-thread sicuro?
Cosa fa 'QueryList'? Gli elementi di '_list' sono stati modificati da un thread diverso (aggiunto o rimosso)? – Groo
dQueryList restituisce solo una raccolta di stringhe. Ho volutamente mostrato che è stata creata una nuova lista, per mostrare che la lista non è mai stata modificata. – Mas