Interviewfragen: Ausnahme im Ereignishandler

8

1) Sie haben 10 Abonnenten für ein Ereignis in Ihrer .NET-Anwendung. Sobald Sie das Ereignis aufrufen, werden die Abonnenten synchron oder asynchron benachrichtigt?

2) Sie haben 10 Abonnenten für ein Ereignis in Ihrer .NET-Anwendung. Jetzt hat ein Event-Handler einen schlechten Code und löst eine Exception aus. Werden die anderen neun Ereignishandler weiterhin ausgeführt?

Danke,

    
Houman 19.02.2011, 23:53
quelle

3 Antworten

19
  

Sie haben 10 Abonnenten für eine Veranstaltung in   Ihre Bewerbung. Sobald du das aufgerufen hast   Ereignis werden die Abonnenten benachrichtigt   synchron oder asynchron?

Es hängt davon ab, wie der Publisher das Ereignis aufruft. In dem typischen Fall (z. B. einem C # -Feld-ähnlichen Ereignis) sind die Handler nur Mitglieder der Aufrufliste eines Multicast-Delegaten. Das Aufrufen des "Ereignisses" entspricht dem Aufruf des Delegierten Delegierten , was wiederum moralisch dem sequenziellen Aufruf jedes einzelnen Mitglieds entspricht. So könnte man einmal einen Aufruf sehen wie:

%Vor%

als ähnlich zu:

%Vor%

Es ist nur eine Sequenz von Delegiertenaufrufen: Die Abonnenten werden synchron benachrichtigt. Natürlich kann der Publisher wählen, das Ereignis beliebig aufzurufen , also muss er es nicht so machen - er kann den Thread-Pool (QUWI / BeginInvoke) oder irgendeinen anderen Mechanismus verwenden das erzeugt asynchrone Benachrichtigungen.

  

Sie haben 10 Abonnenten für eine Veranstaltung in   Ihre Bewerbung. Jetzt ein Ereignis   Der Handler hat einen schlechten Code und er wirft   eine Ausnahme. Mache die anderen neun Ereignisse   Handler fahren noch fort?

Es kommt wieder darauf an. Im typischen (oben genannten) Fall lautet die Antwort nein , da Ausnahmen nicht pro Abonnent behandelt werden. Wenn ein Handler wirft, wird der Rest der "foreach" aufgegeben. Natürlich gibt es nichts, was einen Publisher davon abhält, den Aufruf jedes Handlers in einen try-catch (ignore) -Block zu verpacken, oder einen anderen Mechanismus zu verwenden, um sicherzustellen, dass alle Handler aufgerufen werden.

    
Ani 20.02.2011, 00:02
quelle
4
  1. Synchron, standardmäßig . Es ist jedoch möglich, asynchrone URLs aufzurufen .
  2. Nein, die Ausnahme wird zur Ereignisquelle springen - was zum Absturz führt. Auch hier ist es möglich, dieses Verhalten zu ändern , indem Sie jeden Handler in einem try / catch einzeln aufrufen.
Mark Brackett 20.02.2011 00:05
quelle
2

1) Kein Threading. Methoden (Teilnehmer) werden synchron ausgeführt.

2) Es kommt darauf an. Die verbleibenden Teilnehmer werden nur ausgeführt, wenn die Ausnahme behandelt wird. Eine Ausnahme hält den Code / Thread sofort an, wenn sie nicht bearbeitet wird. Dies bedeutet, dass wenn 2 von 10 Subskriptions-Methoden ausgeführt wurden, wenn die Ausnahme auftritt, die remaning 8 nicht ausgeführt wird.

Ereignisse sind einfach Listen von Methoden, die aufgerufen werden sollen. .Net macht das für Sie hinter den Kulissen.

    
Tedd Hansen 19.02.2011 23:57
quelle

Tags und Links