2016-07-09 8 views
0

Ich bin gewohnt, Delegate EventHandler für Ereignisrückrufe zu verwenden, aber jetzt versuche ich Ereignis Aktion zum Aufrufen von Ereignissen zu verwenden. Ich konnte nicht viele Informationen darüber finden, wie dies überall richtig verwendet werden kann, also hoffe ich, dass jemand mich in die richtige Richtung weisen kann.Ereignisse mit Ereignis auslösen Aktion <T>

Ich habe einen Action-Ereignishandler, der String-Objekte behandelt. In meiner Abonnentenklasse habe ich public event Action<string> UploadProgress;. Der Event-Handler wird wie folgt aufgerufen:

UploadProgress.Invoke(string.Format("sending file data {0:0.000}%", (bytesSoFar * 100.0f)/totalToUpload)); 

Die Listener-Klasse auf dieses Ereignis abonniert ist wie folgt:

uploadFile.UploadProgress += uploadFile_UploadProgress; 
void uploadFile_UploadProgress(string obj) 
{ 
    var prog = obj; 
} 

Wenn das Ereignis aufgerufen wird, ich System.NullReferenceException: Object reference not set to an instance of an object bekommen. Ich bin nicht sicher, was ich in der Teilnehmerklasse ändern muss, um diesen Fehler zu vermeiden. Kann mir jemand sagen, wie ich die Event-Aktion richtig nutzen soll oder mir den Link zu der Stelle geben soll, wo ich sie lesen kann? Ich weiß, wie man die normale Action benutzt, aber verwirrt darüber, es als Ereignis zu deklarieren. Jede Hilfe wird geschätzt.

Antwort

1

Auf diese Weise ist viel besser, bytesToUpload und totalToUpload durch Ereignis, statt der gesamten Aktion (rechte Probe) senden:

internal class Program 
    { 
    private static void Main(string[] args) 
    { 
     SomeClass someClass = new SomeClass(); 
     someClass.UploadProgress += SomeClass_UploadProgress; 
     someClass.DoSomeUpload(); 
    } 

    private static void SomeClass_UploadProgress(object sender, UploadEventArgs e) 
    { 
     string s = string.Format("sending file data {0:0.000}%", (e.BytesSoFar * 100.0f)/e.TotalToUpload); 
     Console.WriteLine(s); 
    } 
    } 

    public class UploadEventArgs : EventArgs 
    { 
    public float BytesSoFar { get; set; } 
    public float TotalToUpload { get; set; } 
    } 

    public class SomeClass 
    { 
    public event EventHandler<UploadEventArgs> UploadProgress; 

    public void DoSomeUpload() 
    { 
     if (UploadProgress != null) 
     { 
     UploadEventArgs e = new UploadEventArgs(); 
     e.BytesSoFar = 123f; 
     e.TotalToUpload = 100000f; 
     UploadProgress.Invoke(this, e); 
     } 
    } 
    } 
+0

Muss ich einen Eventhandler an seinem Platz haben? kann ich nicht einfach das öffentliche Ereignis Aktion UploadProgress verwenden? –

+0

in Ordnung Danke! –

+0

Warum ist UploadProgress immer null? Der Code innerhalb des Blocks wird niemals ausgeführt. –