Dodawanie item'ów do Listy z kilku wątków na raz w jednym momencie

0

Witam, nie jestem do końca pewien, dlatego muszę się Was spytać o jedną rzecz. Mianowicie kiedy mam utworzoną listę, to czy z kilku wątków jednocześnie może zostać wywołany kod "List.Add(item)"? Pytam, bo nie wiem czy w przypadku listy item'y, które mają zostać dodane się zakolejkują, czy jednak muszę sam nałożyć jakąś blokadę, aby się zakolejkowały.

1

Musisz samemu założyć locka, albo użyć jakiegoś odpowiednika z przestrzeni nazw System.Collections.Concurrent.

1

Musisz to zrobić sam. W C# GUI działa w konkretnym wątku (głównym wątku aplikacji). Nie możesz dobrać się do GUI z innego wątku. Musisz zastosować Invoke i blokady.

Ja to robię w taki sposób (na przykładzie listy stringów):

void DoAddToList(string s)
{
    list.Add(s);
}

public void AddToList(string s)
{
    lock(lockObj)
    {
         if(InvokeRequired)
             BeginInvoke(new Action(() => DoAddToList(s)));
         else
             DoAddToList(s); 
    }   
}

Działa to tak. Jest sobie prywatna metoda: DoAddToString, która wywołuje faktyczną operację dodania elementu do listy. Następnie jest publiczna metoda AddToList, którą bez obaw mogę wywoływać z dowolnego wątku. Metoda jest synchronizowana (lock) i sprawdza, czy znajduje się w wątku GUI (InvokRequired). Jeśli nie znajduje się w wątku GUI, to za pomocą BeginInvoke wywołuję swoją metodę DoAddToList. BeginInvoke spowoduje, coś w stylu, że poinformuje wątek GUI, że ma wywołać tą metodę. Gdy aplikacja przełączy się na wątek GUI (nie wiesz, kiedy to się stanie tak naprawdę), metoda zostanie wykonana.

Jeśli wątek GUI jest jednak wątkiem aktualnym, to wtedy InvokeRequired zwróci false, a zatem można normalnie wywołać metodą DoAddToList.

Rozumiesz?

1 użytkowników online, w tym zalogowanych: 0, gości: 1