Czy dobrze to napisałem : Zapisywanie do pliku w wielu watka

0

robie wielowątkowe zapisywanie do jednego pliku. Tzn. ftp ciagnie wiele części pliku i zapisuje do jednego pliku. Wykombinowałem to tak :

void CzytajStrumien(ref bool czyWolnyStrumien,FileStream plik_wyjsciowy )
{
socket.Receive(...);
 while (true)
                {
                    if (czyWolnyStrumien)
                    {
                        czyWolnyStrumien = false;
                        plik_wyjsciowy.Seek(offset, SeekOrigin.Begin);
                        plik_wyjsciowy.Write(buffer, 0, ileBajtow);
                        czyWolnyStrumien = true;
                        break;
                    }
                }
}

teraz uruchamiam takich wiele w roznych watkach i podaje tą samą zmienna " czy wolny strumien"

Czy to jest dobrze zrobione ? Czy może ma jakieś wady i należy to zrobić inaczej ?

1

Hmm.. Lepiej by było mutexem albo lockiem. I po co ci ta pętla nieskończona? :|

0

zrob to na locku

object fileLock = new object();

void czytaj(...)
{
    lock (fileLock)
    {
        // do tego kodu może wejść tylko jeden wątek w tym samym czasie
        // jeśli wątków jest więcej to pozostałe czekają aż ten wyjdzie z tego bloku
        plik_wyjsciowy.Seek(offset, SeekOrigin.Begin);
        plik_wyjsciowy.Write(buffer, 0, ileBajtow);
    }
}
0

Tak jak koledzy napisali - tylko lock();

Gdybyś użył swojej zmiennej "czyWolnyStrumien", dwa wątki mogłyby wejść we fragment kodu po warunku.

Inna opcja to zastosowanie ReaderWriterLockSlim - np. w przypadku gdyby kilka wątków czytało, a kilka zapisywało (czytanie można zrealizować jednocześnie, a pisanie blokuje i czytanie i pisanie).

0

dzięki , wiedzialem że musi być jakiś orginalniejszy sposób. A co do lock to mogę wstadzić w niego strumien ?
lock(plik_wyjsciowy)
{
plik_wyjsciowy.seek....
}

0

może to być dowolny obiekt (lub typ). Pamiętaj tylko, żeby nie zmieniac go podczas wywolywania kodu.

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