Delegates gemeinsam von mehreren Threads genutzt
-
Hallo zusammen,
im Moment beschäftige ich mich viel mit Multithreading und stolpere ein ums andere Mal über die Frage: darf ich das so?
Auch hier wieder, mit folgendem Szenario:
Es lebt irgendwo eine Klasse "MethodPool", mit einer Methode A, nun wird ein Delegate erstellt, welcher auf diese Methode A zeigt, und weiter gegeben an 2 unterschiedliche Threads, welche synchron laufen. Die Threads rufen die Methode A über den Delegaten auf.
Könnte dies Schwierigkeiten bereiten? Die Threads teilen nichts, außer diesem Delegaten, keine Statusvariablen, etc, was irgendeine Synchronisation bedürfen würde.
Gruß,
_sharedResources
-
Dies löst mein Problem: http://www.dotnet247.com/247reference/msgs/45/225459.aspx
Mir klingt die Argumentation einleuchtend.
-
Und ich kann dies nochmals bestätigen. Grundsätzlich ist das am Ende nur ein Methodenaufruf. Und eine Methode darfst du ja von zwei unterschiedlichen Threads gleichzeitig aufrufen. Aufpassen muss man wie auch im Thread gesagt bei Events. Aber dort gibt es eine einfache Abhilfe:
public event EventHandler MyEvent; // ... private void RaiseEvent() { var evt = this.MyEvent; if(evt != null) { evt(this, new EventArgs()); } }
Damit ist man zumindest vor einer
ArgumentNullException
gesichert. Natürlich bleibt das Problem bestehen, dass eine Methode trotzdem aufgerufen wird, obwohl sie sich womöglich bereit abgemeldet hat. Oder sie wird nicht aufgerufen, obwohl sie bereits angemeldet wurde. Darauf muss man dann eben einfach acht geben.Grüssli
-
Delegates in .NET sind soweit ich weiss "immutable", d.h. man kann sie problemlos aus mehreren Threads gleichzeitig aufrufen.
(Das "ändern" von Delegates wird gleich wie bei Strings gemacht, es wird einfach immer ein neues Objekt erstellt.)
-
Ich meinte ich hätte in folgendem Buch von Jeffrey Richter gelesen, dass Delegaten und Threads Probleme bereit halten seien...
Microsoft .NET Framework-Programmierung in C# | ISBN: 9783860639849Muss ich mal wieder nachlesen...
-
Alles + Threads hält Probleme bereit.
Das blosse Aufrufen von Delegates aus verschiedenen Threads ist allerdings kein solches Problem.