Announcement

Collapse
No announcement yet.

Invoke und event. Remoting

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Invoke und event. Remoting

    Hallo,

    habe ein sehr schwerwiegendes Problem.

    Ich habe ein Remoting-ClientObject abgeleitet von der Klasse MarshalByRefObject und einem selbstdefinierten Interface. Weiterhin hat die Klasse einen EventHandler. In einer anderen Klasse baue ich nun die Verbindung zum Server auf und übergebe diesem das ClientObject. Der Server schickt nun über das Clientobjekt ein dataSet an den Client. Das Clientobjekt empfängt das DataSet und löst ein Event aus, das Daten vorhanden sind. Dieses Event im Clientobjekt wird über einen Thread gefeuert. Die übergeordnete Klasse empfängt das Ereignis und wirft wiederum einen Event an das Hauptprogramm.
    Im Hauptprogramm hole ich das DataSet aus dem Clientobjekt ab und über die Methode DataGrid.Invoke(...) binde ich dieses an das Grid.

    Soweit funktioniert alles wunderbar und auch richtig.

    Nun zu meinem Problem:
    Wenn ich das Programm starte funktioniert das alles ohne Probleme. Im Hauptprogramm erhalte ich das Ereignis und über die Invoke-Methode binde ich das DataSet an das Grid, sooft ich möchte.
    Ich sollte noch erwähnen, das die Klasse, die die Verbindung zum Server herstellt, dies immer wieder versucht und wieder Aufbaut, wenn der Server nicht mehr Ansprechbar ist. Funktioniert auch prima.
    Wenn ich nun den Server abschalte, und wieder starte, dann bekomme ich immer noch das Ereignis. aber die Invoke-Methode verläuft irgendwie im Sande sprich, sie löst keine Exception oder sonstige Handlung aus sondern beendet meine Prozedur ohne jemals in der angegebenen Prozedur zu landen.

    Ich bin irgendwie ratlos. Kann mir jemand helfen??

    Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.

    MfG
    Ronny

  • #2
    Hi,

    meinst du mit Client Object "Client Activated Objects" also CAO?

    Wenn ja würde ich dir empfehlen es auf ein SingleCall Server Object zu ändern und am Client dann nur über das Interface zu arbeiten. Das hat den Vorteil das du wenn der Server "stirbt" und er neu gestartet wird, keine Referenzen vom Client auf die Objekte des Servers hast du ja zwangsläufig beim Neustart andere Object Ids bekommen.

    Führst du den Code in einem separatem Thread aus? Wenn ja werden die Exceptions dieses Threads nicht an den Hauptthread weitergegeben. In diesem Fall musst du deine Fehlermeldungen "still" dem User mitteilen, so ungefähr wie Outlook 2003 wenn es gerade mal keine Daten fetchen kann und es in der Statusbar diese Information für den User einblendet.

    Nach deiner Beschreibung des Fehlers zu urteilen passiert irgendwo in dem separatem Thread ein Fehler. Dort würde ich mal alles mit Exceptions abfangen.

    Beispielcode könnte so ähnlich aussehen. Achtung nur kurzform.

    <PRE>

    // Öffentliches Interface
    public interface IGetData
    {
    DataSet GetData();
    }

    // Remote Object als SingleCall implementiert
    // IGetData Interface
    public class GetDataManager: MarshalByRefObj, IGetData
    {
    public DataSet GetData
    {
    return...
    }
    }

    // Client Klasse die Events feuert
    public class GetDataClientController
    {
    public event DataFetchedEvent....
    public Exception LastThrownException;
    public DataSet LoadedData;
    public bool ErrorOccured;

    public void GetDataFromRemoteServer()
    {
    IGetData iGetData = ...Interface auf Remote Object holen
    try
    {
    this.ErrorOccured = false;
    this.LastThrownException = null;
    this.LoadedData = iGetData.GetData();
    }
    catch (Exception ex)
    {
    this.LastThrownException = ex;
    this.ErrorOccured = true;
    }
    }
    }

    // Client Klasse
    public class Client
    {
    ... an Event anhängen

    public void GetDataEvent(Object sender, EventArgs e)
    {
    if (GetDataController.ErrorOccured == false)
    {
    ... hier Invoke auf Hauptthread
    }
    else
    {
    ... Eventuell Info an User.
    }
    }
    }

    </PRE&gt

    Comment


    • #3
      Hallo,

      ich arbeite über Interfaces. Das Clientobject ist eine Klasse die Serialisierbar ist und über ein Interface an den Server gesendet wird, der darauf zugreifen kann. Diese Klasse wirft ein Event, was ich in meinem Hauptprogramm abfange. Der Server schickt nun an den Client ein DataSet, dass ich in meinem Hauptprogramm an ein DataGrid binden möchte. Da ich dies nur über ein DataGrid.Invoke machen kann, habe ich ganau an dieser Stelle ein Problem. Das Invoke kann ich starten, es lößt KEINE Exception aus, aber verschwindet auf nimmer weidersehen. Der restliche Quellcode wird auch nicht ausgeführt, sonder die Prozedur wird ohne Fehler oder sonstige Meldung beendet. Auch die Aufrufende Prozedur bekommt keinen Fehler.

      MfG
      Ronny Malysk

      Comment


      • #4
        Hi,

        deine Server Klasse wird die jetzt mit SingleCall oder Singleton genutzt oder mit ClientActivated?

        Wenn ich es richtig verstanden habe, feuert das ClientObject auf der Serverseite dann das Event?

        Du könntest das Invoke auch selbst programmieren indem du ein Delegate machst und es dann auf dem Hauptthread aufrufst, dort kannst du dann direkt mit SetDataBinding dein DataGrid binden

        Comment

        Working...
        X