2010-04-14 11 views
10

Hablando de System.Collections.Generic.List<T> aquí.¿Pueden dos o más hilos iterar sobre la misma lista <t> sin ningún problema?

Con el ejemplo siguiente, ¿pueden ejecutarse Method1 y Method2 al mismo tiempo, en diferentes subprocesos sin ningún problema?

Gracias

class Test 
{ 
    private readonly List<MyData> _data; 

    public Test() 
    { 
     _data = LoadData(); 
    } 

    private List<MyData> LoadData() 
    { 
     //Get data from dv. 
    } 

    public void Method1() 
    { 
     foreach (var list in _data) 
     { 
      //do something 
     } 
    } 

    public void Method2() 
    { 
     foreach (var list in _data) 
     { 
      //do something 
     } 
    } 
} 

Respuesta

22

Sí, List<T> es seguro para leer desde varios subprocesos, siempre y cuando no hay temas son modificar la lista.

De the docs:

Un List<T> puede soportar múltiples lectores al mismo tiempo, siempre y cuando no se modifique la colección . Enumerar a través de una colección es intrínsecamente no es un procedimiento seguro thread-safe. En el raro caso en que una enumeración contenga uno o más accesos de escritura , la única forma de garantizar la seguridad de subprocesos es bloquear la colección durante toda la enumeración . Para permitir el acceso a la colección por medio de múltiples hilos para leer y escribir, debe implementar su propia sincronización.

(El punto sobre la iteración ser "intrínsecamente no es un procedimiento seguro para subprocesos" se pronuncie respecto de otra cosa mutación de la lista.)

0

Puede utilizar los iteradores conseguido por el foreach() simplemente finas en múltiples hilos. Siempre y cuando no agregue o elimine elementos de la lista, debería estar bien. Creo que incluso puede modificar los miembros de lo que sea que sea, pero esto lo lleva a un territorio no seguro para subprocesos.

Cuestiones relacionadas