Obsługa zdarzenia w aplikacji wielowątkowej

Obsługa zdarzenia w aplikacji wielowątkowej
mariano901229
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:597
0

Witam
Mam problem z obsługą zdarzenia przy wykorzystaniu wielu wątków, otóż poniższy kod wyrzuca mi wyjątek wg. którego lokalne zdarzenie localMyEvent jest nullem. Mimo zastosowaniu locka i dodatkowego sprawdzenia czy zdarzenie nie jest nullem.

Kopiuj
 
 try
{
                    EventHandler<FileOperationEventArgs> localMyEvent;
                    lock (this.myEventLock)
                    {
                        localMyEvent = this.fileOperationFinished;
                      
                    }
                    if (localMyEvent != null)  
                    localMyEvent(this, new FileOperationEventArgs(FileOperationEventArgs.FileOperationType.Read));
                      

                    
}
catch (Exception ex)
{
                    
               MessageBox.Show(ex.ToString());
}

Problem jest zatem najprawdopodobniej tutaj

Kopiuj
 
  if (localMyEvent != null)  
// jakby inny wątek wykorzystywał zdarzenie
localMyEvent(this, new FileOperationEventArgs(FileOperationEventArgs.FileOperationType.Read));

Jednakże zdarzenie globalne jest przypisywane do zdarzenia lokalnego i blokowane przy wykorzystaniu lock'a. Na chłopski rozum wg mnie powinno być ok.

Pozdrawiam

katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
1

lock jest zbedny a nawet szkodliwy w tym wypadku. kod ponizej wystarczy aby ten kawalek byl thread safe.

Kopiuj
 
                    EventHandler<FileOperationEventArgs> localMyEvent = this.fileOperationFinished;
                    if (localMyEvent != null)  
                    localMyEvent(this, new FileOperationEventArgs(FileOperationEventArgs.FileOperationType.Read));
                

problem musi byc gdzie indziej, daj blad ktory ci rzuca i calosc kodu

0

Dobrze jest poznać nową bibliotekę TPL do obsługi wielowątkowości

Helion.pl jest książka doktora Jacka Matulewskiego za kilka PLN jako e-book

http://helion.pl/ksiazki/programowanie-rownolegle-i-asynchroniczne-w-c-5-0-mateusz-warczak-jacek-matulewski-rafal-pawlaszek,proch5.htm

mnie się podoba podobnie jak w slowie wstępnym recenzja
-> ten autor bardzo sympatyczny polski naukowiec , kochający swoją rodzinę, potrafiący dość uczciwie i interesująco opowiadać...
zgadzam się: to prawda co pisze w recenzji tej książki...

mariano901229
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:597
0
katelx napisał(a):

lock jest zbedny a nawet szkodliwy w tym wypadku. kod ponizej wystarczy aby ten kawalek byl thread safe.

Kopiuj
 
                    EventHandler<FileOperationEventArgs> localMyEvent = this.fileOperationFinished;
                    if (localMyEvent != null)  
                    localMyEvent(this, new FileOperationEventArgs(FileOperationEventArgs.FileOperationType.Read));
                

problem musi byc gdzie indziej, daj blad ktory ci rzuca i calosc kodu

Problem usunąłem faktycznie był gdzie indziej. Dziękuje za radę z lockiem.
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.