Hm. Also ich seh hier ein MEssageQueue.Message.Body As Object und einen BodyStream. Ich vermute schon, dass die messagequeue serialisierte objekte enthalten kann. Es ist allerdings die grosse frage, ob es nicht mit kanonen auf spatzen geschossen ist, diese Message Queue für multithreading zwecke zu gebrauchen/mussbrauchen.
Withevents ist schon nett. Wenn ich jetzt noch irgendwie den Threading-Kontext zur Withevents-variable definieren könnte und mir das msg-gequeue sparen könnte wäre das schon schön. Genauso sollte das bei funktionsaufrufen möglich sein. (Träum)
Das ActiveObject Pattern kenn ich; Musst aber aufpassen, sind 2, 3 Denkfehler in der wurstl-ausführung drin. (Kann dir leider nicht mehr sagen, was das war)
Was mir zu dem Pattern aufgefallen ist:
- Funktionsaufrufe und Ereignisszuteilung kannst du über diesselbe MsgBase.WaitUntilConsumed methode abarbeiten, die virtuell ist, weil...:
- ...Interessant - wo ich gerade dranhänge - ist auch, dass es Composite-Ereignisse gibt: Die haben folge-ereignisse, die aber erst während der abarbeitung des ereignisses instanziert werden. Eine wartevorgang muss (optional?allgemein definierbar?)diese folgeereignisse mit einschliessen (können). Eine direkte Verknüpfung mit einem ProgressWindow ist denkbar.
- In grösseren Projekten grösser sagmal 20 ActiveObject-Klassen lohnt es sich mit codegeneriung zu arbeiten, um das verpacken/entpacken der parameter in die entsprechende message objekt zu realisieren: (Das senkt Fehlerquellen und macht den user-code kompakter.)
- pro funktionsaufruf gibt es eine generierte klasse mit hartkodierten membern für jeden parameter. (dürfte auch unter .net performance bringen)
- Für Codegenerierung gibts den namespace System.CodeDOM.
- Für die Client-Seite brauchst du eine code generierung. (oder du musst die msg.-objekte manuell befüllen, was seeehr ätzend ist)
- Ich glaube für die Server seite brauchst du nicht unbedingt eine code genierung sondern kannst du auch die dot net reflection verwenden: irgendwie so:
servant.GetType.GetMember(aMsg.MemberName, aMsg.ParameterTypeArray).Invoke(obj, aMsg.PArameterArray)
(ok, das MemberInfo Objekt speicherst du dir sinnigerweise in der msg ab, statt dem MemberNAme)
ein bisschen mehr dynamische sprache und aspektorientierte programmierung wären hier sehr hilfreich... vielleicht ein MemberInfo.BeforeInvoke ereigniss... oder ein GetType.Members.Add vielleicht (Träum)
gruss,
karle
PS:
ParalellExecutionContext.AddDecorator hmm...
generier dir doch ein paar zeilen code für die threadmain daraus:
In Dot net kannst du recht einfach zur laufzeit assemblies generieren und ausführen. Fügst du noch eine REferenz auf deine eigene Assembly an und du kannst den applikationskontext im aufruf übergben: CodeDomSample:
http://msdn.microsoft.com/en-us/library/h82xde1t.aspx
was du da machst gefällt mir ich glaub ich muss mich mal für deinen job bewerben ;)