informatikerin86 Geschrieben 14. Mai 2010 Geschrieben 14. Mai 2010 Hallo Leute, ich soll Informationen zu reaktiver Programmierung in C# suchen. Als Beispiel habe ich INotifyPropertyChanged bekommen, das ist im Grunde reaktive Programmierung allerdings nicht besonders elegant. Das Ziel ist es weniger Events von Hand registrieren zu müssen. Im Internet finde ich einige Informationen, aber leider keine mit denen ich richtig weiter komme. Bisher habe ich Clinq weiterverfolgt und einen Blog-Eintrag: Reactive Programming in C#: ReactiveObject Andy Kutruff Kennt sich hier jemand zufällig mit dem Thema aus und könnte mir Tipps geben? Grüße Informatikerin Zitieren
Mcolli Geschrieben 17. Mai 2010 Geschrieben 17. Mai 2010 Hallo, ich habe Dir mal ein Sample Code mit einigen Kommentaren geschrieben. Die Oberfläche besteht aus einer Form mit einer Listview, einem Start knopf und einem Knopf zum wild draufrum drücken um zu zeigen dass die Form tatsächlich noch reagiert. Zusätlich liegt demProgramm noch eine Klasse bei deren Instanzen in der Listview dargestellt werden. Der Code der Form beinhaltet das erzeugen der darzustellenden Instanzen so wie den nötigen Code um eine längere Arbeit im Hintergrund zu sumulieren und die Oberfläche während der "Arbeitszeit" reaktiv zu halten. Zudem wird während der "Arbeitzeit" die Oberfläche manipuliert (es werden Items zur Listview hinzugefügt). Trotz all dem bleibt diese reaktiv. grundsätzlich soll das nur ein einfaches Beispiel sein. Wenn Du länger Abreiten am Objektmodell von statten gehen lassen willst solltest Du diese Arbeit AUF KEINEN FALL in GUI Komponenten Reinbringen. z.B.: eine Form zeigt eine Liste von Autos un deren verfügbarkeit an. Die Liste der Autos muss immer aktuell sein und somit regelmäßig (z.b. Alle 2 Sek) geupdatet werden. Zu dem soll der User noch selber ein bestimmtes Auto aus der Liste manuell Updaten dürfen. Das Grobe Design wäre dann eine Form für die Oberfläche (sammt Knopf) Eine Klasse Die ein Auto representiert. Eine Klasse die einen Automanager representiert. Der Automanager initialisert seine Liste, führt diese, Updated diese und kann einzelene Autos neuladen. Der Automanager verfügt über Events mit deren Hilfe er zu allen Programmteilen die sich für bestimmte Ereignise interessieren komunizieren kann. Der Form ist der Automanager bekannt und kann über öffentliche Methoden des Automanagers diesen Anweisen was tolles zu tun. Um auf Ereignise des Automanagers zu reagieren meldet die Form bei diesem eigene EventHandler an.Reaktiv.zip Zitieren
informatikerin86 Geschrieben 18. Mai 2010 Autor Geschrieben 18. Mai 2010 Wow, vielen Dank für deine lange Antwort und den Code! Das ist ein interessanter Ansatz!! Ob es zu dem passt was mein Chef genau sucht werde ich noch sehen. Auf jeden Fall nochmals vielen Dank für deine Mühe! Grüße Informatikerin Zitieren
Mcolli Geschrieben 18. Mai 2010 Geschrieben 18. Mai 2010 Immer wieder gern. Wenn du, statt "Windows Forms", WPF (Windows Presentation Foundation) zur Oberflächengestalltung nutzt kannst Du Dir die Mühe mit den delagtes und events zur Anzeigeaktualisierung sparen. Dann muss die angezeigte Klasse "INotifyPropertyChanged" implementieren und alle relevanten Properties bei neu zuweisung eines Wertes das PropertyChanged Event callen. Die Instanzen der Objekte werden dann in einer Liste vom Typ "ObservableList<Type>" geführt und diese der Listview als Databinding zugewiesen werden. Mit einem DataTemplate für die Klasse kannst Du dann die Darstellung einer Instanz der anzuzeigenden Klasse deffinieren und dieses als ItemTemplate der Listview zuweisen. Damit werden dann Änderung an Objekten der Liste automatisch angezeigt. Zu min in der Theorie: Das ist im Mom noch ein bischen verbuggt und Du musst einen Standart Workaround für die Observable List Einbauen .... ein SampleCode kann ich bei bedarf mal erstellen - meld dich einfach wenn das benötigt ist. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.