Utilizzando miei EventArgs Cusom come ad esempio:EventHandler <TEventArgs> sicurezza thread in C#?
public event EventHandler<MyEventArgs> SampleEvent;
da msdn esempio:
public class HasEvent
{
// Declare an event of delegate type EventHandler of
// MyEventArgs.
public event EventHandler<MyEventArgs> SampleEvent;
public void DemoEvent(string val)
{
// Copy to a temporary variable to be thread-safe.
EventHandler<MyEventArgs> temp = SampleEvent;
if (temp != null)
temp(this, new MyEventArgs(val));
}
}
ho domanda:
1) guardando il codice marcato:
non vedo un motivo per cui dovrebbe essere copiato su un altro parametro (per quanto riguarda le discussioni)
dal momento che abbiamo la event
keyowrd, nessuno può toccare il suo elenco invocazione (nessun codice estraneo alla classe intendo)
2) Se im non sbaglio, la funzione DemoEvent
dovrebbe essere virtuale, in modo che possa essere sovrascritto in classi di sub ... (im sicuro Ho visto da qualche parte)
la cosa strana è che ReSharper anche wont aggiungere virtuale :
Quindi, se ho questo codice:
mi suggerisce:
e quando ho premerlo:
così ancora una volta la mia domande:
1) Qual è lo scenario che risolverà questa riga EventHandler<MyEventArgs> temp = SampleEvent;
in merito alla sicurezza dei thread?
2) la funzione non deve essere virtual
? (sono sicuro che abbia visto questo modello con virtuale)
Il riassuntore è solo un punto di vista su giusto e sbagliato. Non è un assoluto – podiluska
Nota che ci sono in realtà due condizioni di gara qui. Questo cambiamento di codice corregge solo una di queste razze. Vedi l'eccellente articolo di Eric Lippert, [Eventi e Razze] (http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx) per una spiegazione completa. – Brian
possibile duplicato di [Eventi C# e sicurezza thread] (http://stackoverflow.com/questions/786383/c-sharp-events-and-thread-safety) –