Ich habe einen Ereignisdelegaten, der wie folgt definiert ist:
%Vor%Ich hebe das Ereignis asynchron an:
%Vor% Anschließend sieht die Signatur von BeginInvoke
wie folgt aus:
In den meisten Beispielen habe ich BeginInvoke
mit dem Parameter @object
aufgerufen, der null
ist, aber ich kann die Dokumentation nicht finden, die erklärt, was der Zweck dieses Parameters ist.
Was ist der Zweck dieses Parameters? Wofür können wir es verwenden?
Damit können Sie relevante Informationen von Ihrer Methode an den Rückruf weitergeben. Da C # Lambda-Ausdrücke hat und Delegaten einen Zustand haben können, ist dies manchmal nutzlos und Sie können einfach null übergeben. Aber es ist ein bisschen ähnlich zu Control.Tag
, und es können Sie dem Callback Informationen geben, die es nützlich finden könnte.
Aktualisierung:
Der Ursprung dessen, warum es überhaupt existiert, geht zurück auf Sprachen, die nur Funktionszeiger hatten, ohne Abschluss. (Sie könnten das Wort "Schließung" nachschlagen wollen ... ich kann es nicht sehr knapp erklären.) In C gibt es nur Funktionszeiger und keine Delegierten; Daher können Funktionszeiger den Status nicht halten. Wann immer Sie einen Rückruf zur Verfügung stellten, half Ihnen der Angerufene, indem er einen zusätzlichen Zeiger für Sie übermittelte, damit Sie Daten an Ihren Rückruf weiterleiten konnten, den er möglicherweise benötigt. In .NET sind diese weniger notwendig (weil Delegaten Target
-Objekte haben und den Status halten können), aber manchmal sind sie nützlich und von dort kommen sie her.
Das ist nur ein Zustandsobjekt, das in IAsyncResult.AsyncState endet kann in Ihrem AsyncCallback-Code abgerufen werden. Ein bisschen wie das ThreadPool.QueueWorkItem (WaitCallback, Object) .
Tags und Links c# multithreading events delegates begininvoke