C# - zdarzenia

0

Witam,
Mam pewną klasę i definiuje dla niej zdarzenie w następujący sposób:

public delegate void UploadProgessHandled(object sender, UploadProgressEventArgs e);

public class UploadProgressEventArgs : EventArgs
{
    private long currentSend;
    private long totalSend;
    public UploadProgressEventArgs(long totalSend, long currentSend)
    {
        this.currentSend = currentSend;
        this.totalSend = totalSend;
    }
    
    public long TotalBytesToSent
    {
        get
        {
            return totalSend;
        }
    }

    public long BytesSent {
        get {
            return currentSend;
        }
    }
}

public class Klasa{
public event UploadProgessHandled UpProgressChanged = null;
...

if (UpProgressChanged != null)
                {
                    UploadProgressEventArgs EventArgs = new UploadProgressEventArgs(fileSize,    
                                                                                                                         count);
                    UpProgressChanged(this, EventArgs);     
                }
}

Chciałbym wykorzystać informacje dostarczane przez te zdarzenie w innej klasie, w następujący sposób...

  public class Klasa2{
        Klasa klasa;
        
        public Klasa2(){
            klasa = new Klasa();
            klasa.UpProgressChanged +=new UploadProgessHandled(up_UpProgressChanged);
        }
  
        void  up_UpProgressChanged(object sender, UploadProgressEventArgs e)
        {
           label.Text = "" + e.BytesSent;
        }

   }

No i tu pojawia się problem, ponieważ podczas tej operacji wyskakuję następujący błąd :
"Nieprawidłowa operacja między wątkami: do formantu label3 uzyskiwany jest dostęp z wątku innego niż
wątek, w którym został utworzony"

Nie mam pojęci o co chodzi, dodam, że jeśli robię np. Console.WriteLine("" + e.BytesSent), to wszystko działa poprawnie.

Z góry dzięki za pomoc, pozdrawiam :).

0

Odwoływanie się do komponentów graficznych z innego wątku niż główny jest potencjalnie niebezpieczną operacją. W wersji .NET 1.0 i 1.1 można było pisać w ten sposób, ale było to potencjalnie niebezpieczne. Dlatego tez od wersji .NET 2.0 wprowadzono wykrywanie tego typu operacji. Rozwiązaniem dla tego typu zadań jest metoda Invoke kontrolek graficznych. Poszukaj w Google słów Thread Invoke C#, z pewnością znajdziesz odpowiedź.

0

Faktycznie metoda Invoke() załatwiła sprawę. Dzięki wielkie za pomoc i pozdrawiam :).

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