synchronizowanie wątków

0

Cześć.
Mam następujący problem. Kończę aplikację, która coś tam sobie robi. Równolegle pewien kod (odpowiadający za rysowanie wykresów i zapis do logu) może być wykonywany przez max. 10 wątków. Nie potrafię sobie poradzić z zsynchronizowaniem zapisu przez te wątki zdarzeń do dziennika logów. Wywala mi exception - że plik jest już używany przez inny proces.
Z poziomu pliku form1.cs startuję wątki, które wykonują funkcję zawarte w innym pliku charts.cs. Wywołanie następuje poprzez kliknięcie na button i zrealizowanie kodu:

UserControl1 us = ctrl as UserControl1;
us.newThread = new Thread(new ThreadStart(us.wykres.CreateChart));
us.newThread.Start();

Plik charts.cs:

public class Charts
    {
        private StreamWriter sw = new StreamWriter("logFile.txt", true);

        private ZedGraphControl zzz;

        public ZedGraphControl ZZZ
        {
            get { return zzz; }
            set { zzz = value; }
        }

        private UserControl1 uc1;

        public UserControl1 Uc1
        {
            get { return uc1; }
            set { uc1 = value; }
        }
        //jakiś kod

        public void CreateChart()
        {
            try
            {
                //tutaj znów jakiś kod
                //poniżej najważniejsza
                    
                    while ()
                    {

                        if ()
                        {

                            if (go == false)
                            {
                                ZZZ.Invoke(Uc1.warnDelegate, "Osiągnięto strefę bezpiecznych wartości");
                            }
                            
                            wpis = "jakis string";
                            sw.WriteLine(wpis);
                            sw.Flush();
                            wpis = null;
                        }
                        if ()
                        {
                            if ()
                            {
                                ZZZ.Invoke(Uc1.warnDelegate, "Osiągnięto strefę 1");
                            }
                            
                            wpis = "jakis string";
                            sw.WriteLine(wpis);
                            sw.Flush();
                            wpis = null;
                        }
                        else if ()
                        {
                            if ()
                            {
                                ZZZ.Invoke(Uc1.warnDelegate, "Osiągnięto strefę 2");
                            }
                            
                            wpis = "jakis string";
                            sw.WriteLine(wpis);
                            sw.Flush();
                            wpis = null;
                        }
                        
                    //jakiś kod odnośnie rysowania wykresow

                    ZZZ.Invoke(Uc1.myDelegate);
                    Thread.Sleep(odstepCzasu * 1000);
                    }
            }
            catch (InvalidOperationException e)
            {
                MessageBox.Show(e.Message);
            }
            catch (ThreadAbortException)
            {

            }
        }         
    }
}

Część pliku userControl1.cs:


public delegate void RefreshDelegate();
public delegate void ShowWarningDialogDelegate(string aaa, string bbb, string ccc);        
public RefreshDelegate myDelegate;
public ShowWarningDialogDelegate warnDelegate;
public Thread newThread = null;

public Charts wykres = null;

public UserControl1()
{
    InitializeComponent();
    wykres = new Charts();
    wykres.ZZZ = zedGraphControl1;
    wykres.Uc1 = this;
    myDelegate = new RefreshDelegate(wykres.ZZZ.Refresh);
    warnDelegate = new ShowWarningDialogDelegate(minDelegate);
}

private void minDelegate(string strLabel1, string strLabel2)        
{
    WarningForm forma = new WarningForm(strLabel1, strLabel2);
    forma.Show();
}

Czy możecie mi pokazać jak to zsynchronizować w ten sposób aby wszystkie uruchomione wątki miały jednoczesny dostęp do pliku logu w momencie gdy chcą coś zapisać? Teraz to jest niemożliwe. Słyszałem że to jest typowy przykład dla wykorzystania wzorca projektowego producent-konsument ale za cholerę nie wiem jak to tutaj zastosować, jakie funkcje etc.
Będe naprawdę dozgonnie wdzięczny za każdą wskazówkę i pomoc.
Pozd.

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