RemoteObject -> Probleme bei Übergabe von Objekten

D12

Mitglied
Hallo Leute,


ich bin bei der Entwicklung einer verteilten Anwendung auf ein Problem gestoßen, bei dem ich nicht weiter komme.

Aufgabenstellung:
Ein Zählwerk sammelt Daten aus einer IO und wertet dieses in verschiedenen Daten-Objekten aus. Dazu gehören strings, integer und ein- sowie mehrdimensionale integer arrays.

Die verteilte Anwendung besteht aus vier Komponenten:
1. RemoteObject, das alle Daten des Zählwerkes verarbeitet.
2. RemoteServer, stellt das RemoteObject als Singleton zur Verfügung.
3. RemoteClient, stellt das Zählwerk aus dem Remote-Object in Balkendiagrammen visuell dar.
4. IOservice, wertet die Signale der IO aus, spaltet diese in gesetzte Bits und übergibt jedes einzelne Bit an das Remote-Object.

Ein direkter Zugriff auf die Member des Remote-Objects ist nicht zulässig, wenn ich das versuche kommt logischerweise folgende Meldung:
MainForm.cs(948,18): error CS0197: 'MyRemoteService.MyService.ctrA' kann als Verweis oder Ausgabe nicht weitergegeben werden, weil 'MyRemoteService.MyService.ctrA' eine Marshal-bei-Verweisklasse ist

Also hat jeder Member eine eigene Methode für die Rückgabe bekommen. Ein Beispiel:
Code:
public int MeineMethode()
{
  return this.x;  //*** X ist ein Beispiel, meine Member haben natürlich aussägekräftigere Namen
}

Die Methode habe ich dann vom Client aufgerufen:
Code:
int x = ro.MeineMethode();  //*** ro stellt mein RemoteObject dar!
So weit funktioniert auch alles. Aber nach einiger Zeit wird das System schwerfällig, weil die Anwendungen den Speicher regelrecht auffressen.

Meine Vermutung war das die Rückgabe-Variablen vom GarbageCollector nicht ordnungsgemäß zerstört werden.

Also habe ich mit CallByReference gearbeitet, damit die Variable nicht bei jedem Aufruf neu erzeugt wird. Denn meine Maske arbeitet mit einem Timer, der bis zu 4x pro Sekunde die Maske aktualisiert.

Neue Lösung:
Code:
public void MeineMethode(ref int tmp)
{
  tmp = this.x;
}

So sah dann der Aufruf in etwa aus:
Code:
int x;
ro.MeineMethode(ref x);

Es hat den selben Erfolg, mein Programm läuft, aber die Speicherprobleme bestehen weiterhin. Ich brauche dringend die nötige Hilfe, da ich nicht mehr weiter komme.

So, mal schauen ob hier einer weiter weis oder ob ich noch tagelang testen, debuggen, Bücher suchen, Bücher lesen und verzweifeln muss.

cu soon
D12
 
Hallo D12!

Ich hoffe Du definierst die Variablen die die Werte vorerst halten,
innerhalb des Timers nicht jedes mal neu.
Definier sie Innerhalb der Klasse die damit arbeitet und dekarier sie dann im TimerEvent.
Was ist es überhaupt für ein Timer?

Ein hoher Speicherverbrauch entsteht auch, wenn man Objekte innerhalb von Schleifen definiert.

MfG, cosmo
 
Problem gelöst, deas Remote Object wurde zu testzwecken von einer Konsolen-Anwendung generiert, die ist standard immer statisch und das habe ich wohl übersehen....
 
Zurück