Laden...

Zyan - Event wird nicht beachtet

Erstellt von ..Heinz.. vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.231 Views
.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 10 Jahren
Zyan - Event wird nicht beachtet

Hallo,

ich habe ein kleines Problem mit Zyan.

Und zwar führe ich auf dem Server eine Berechnung durch und möchte, wenn diese fertig ist, auf dem Client die Anzeige ändern.

Dazu habe ich mir ein Event erstellt, welches im Server aufgerufen wird, wenn die Berechnung fertig ist und im Client "ausgeführt" wird.

Dan funktioniert leider nicht. Wenn ich am Server das Event konsumiere, läuft noch alles.

Anbei ein vereinfachter Code, der leider ebenso nicht funktioniert.

Server:

public class Zeit : Interface.IZeit
    {
        public Zeit()
        {
            int _sekundeAlt = System.DateTime.Now.Second;

            while (true)
            {
                if (_sekundeAlt != System.DateTime.Now.Second)
                {
                    if (ZeitEvent != null) ZeitEvent(this, new ZeitEventArgs() {Sekunde = DateTime.Now.Second});
                    _sekundeAlt = System.DateTime.Now.Second;
                }
            }
        }

        #region Implementation of IZeit

        public event EventHandler<ZeitEventArgs> ZeitEvent;

        #endregion
    }

Client:

class Program
    {
        static void Main(string[] args)
        {
            var zyanConnection = new Connection();
            zyanConnection.OpenClient("Zeit", "127.0.0.1");
            var zeit = zyanConnection.CreateProxy<IZeit>();
            zeit.ZeitEvent += (s, e) => { Console.WriteLine(e.Sekunde); };

            Console.ReadLine();
        }
    }

Interface für Zyan:

public interface IZeit
    {
        event EventHandler<EventArgs.ZeitEventArgs> ZeitEvent;
    }

Meine Zyan Configuration sieht wie folgt aus:

ZyanComponentHost.LegacyBlockingEvents = true;

            var tcpBinaryServerProtocolSetup = new TcpBinaryServerProtocolSetup();
            tcpBinaryServerProtocolSetup.UseWindowsSecurity = true;

            tcpBinaryServerProtocolSetup.TcpPort = port;
            _zyanComponentHost = new ZyanComponentHost(name, tcpBinaryServerProtocolSetup)

Könnt ihr mir vielleicht sagen, ob etwas fehlt?

Gruß

..Heinz..

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 10 Jahren

Hallo,

ich habe weiter versucht, den Fehler zu finden, aber leider funktioniert es immer noch nicht.

Ich starte den Server, dann den Client; aber "ZeitEvent" im Server ist immer "null".

Habe ich etwas übersehen?

Ich benutze die Version 2.5.0.

Gruß

..Heinz..

W
872 Beiträge seit 2005
vor 10 Jahren

Kenne mich nicht mit Zyan aus, aber es geht um IPC InterProcessCommunication.
Daher sind der Client und der Server 2 seperate Einheiten.
Du willst wohl einen Push Client schreiben.
Dir fehlt im Server auf jeden Fall die Verknuepfung zwischen dem Client/Request und dem Event - wo kann ich Dir auch nicht sagen.

2.298 Beiträge seit 2010
vor 10 Jahren

Hallo ..Heinz..,

hast du mal auf der Projektseite (http://zyan.codeplex.com/) versucht, eine Lösung zu finden?
Speziell nehme ich an, dass du in der Dokumentation zu Zyan fündig gewurden wärest.

Deutsche Zyan Dokumentation

Speziell habe ich dazu in den Diskussionen noch folgendes gefunden: Invoke Method from server back to client

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 10 Jahren

@weismat:
Danke für deine Antwort.
Zyan unterstützt zwar IPC, jedoch heißt es in der Doku: Doku für verteilte Ereignisse

Ereignisse funktionieren mit jedem ProtocolSetup. Und im Beispiel (Mini Chat) wird auch kein IPC verwendet.

@inflames2k:
Natürlich habe ich schon auf der Projektseite gesucht und mir auch das Mini Chat Beispiel herunter geladen und den Code durchsucht. Nur leider scheint es an einer Stelle zu haken.
Danke für deinen Link zum Broadcast Beispiel.

Wenn ihr noch weitere Ideen habt, dann nur her damit. Solange suche ich weiter 😃

Gruß

..Heinz..

2.298 Beiträge seit 2010
vor 10 Jahren

Das erste Problem was ich sehe, ist dass du das Event im Konstruktor werfen möchtest und an der Stelle kann kein Handler gebunden sein.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 10 Jahren

Ich habe es jetzt mal wie folgt umgestellt:
Server:

    public class Zeit : Interface.IZeit
    {
        private int _sekundeAlt;

        #region Implementation of IZeit

        public event Action<int> ZeitEvent;

        public void GetZeit()
        {
            _sekundeAlt = System.DateTime.Now.Second;

            while (true)
            {
                int sekundeNeu = System.DateTime.Now.Second;
                if (_sekundeAlt != sekundeNeu)
                {
                    var zeitEvent = ZeitEvent;
                    if (zeitEvent != null)
                    {
                        try
                        {
                            zeitEvent(sekundeNeu);
                            _sekundeAlt = sekundeNeu;
                        }
                        catch (Exception exception)
                        {
                            Console.WriteLine(exception.Message);
                        }
                    }
                }
            }
        }

        #endregion
    }

Client:

class Program
    {
        static void Main(string[] args)
        {
            var zyanConnection = new Connection();
            zyanConnection.OpenClient("Zeit", "192.168.2.148");
            var zeit = zyanConnection.CreateProxy<IZeit>();

            while(true)
            {
                if (Console.ReadLine().ToString() == "Start")
                {
                    zeit.ZeitEvent += (sec) => Console.WriteLine("Client: " + sec);
                }
            }
        }
    }

Das Problem bleibt leider.

Gruß

..Heinz..

Gelöschter Account
vor 10 Jahren

Vorab, dein aktueller Code ist ein typisches Beispiel für das Jacketing Problem.

@weismat
Zyan verfolgt ganz bewusst ein Server/Client Konzept, anders gesagt:
Client und Server sind in Zyan immer 2 seperate Einheiten, die sich auch genau so verhalten, ganz unabhängig vom Protokoll. Nach meiner Erfahrung gibts keine Einschränkungen für spezifische Protokolle, das würde dem Konzept von Zyan auch völlig wiedersprechen. (eigentlich verstehe ich deinen ganzen Hinweis nicht, wenns kein IPC ist, sondern Netzwerkkommunikation sind das doch erst recht 2 verschiedene Einheiten)

@heinz
Was mich verwirrt, dein Code macht keine ICP Connection auf, sondern startet ein binäres Remoting, oder habe ich mich da verguggt?

16.806 Beiträge seit 2008
vor 10 Jahren

Weißt Du, was Dein Code da tut?

  1. In der Main würdest Du ständig neue Event-Abonennten defieren. Wieso?
  2. Ich sehe nirgends ein Aufrufen von GetZeit. Wieso überhaupt ein verdammt anfälliges whilte(true) und kein Timer in der Zeit-Klasse?

var zeit = zyanConnection.CreateProxy<IZeit>();
zeit.ZeitEvent += (sec) => Console.WriteLine("Client: " + sec);
Console.ReadKey();
.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 10 Jahren

Zuerst einmal vielen Dank für eure Hilfe und das Interesse.

@Sebastian.Lange:
Du hast dich nicht verlesen... Aber ich habe es korrigiert 😉 Jedoch weiß ich nicht, ob es nötig ist, da im Mini Chat Beispiel auch kein IPC verwendet wurde.

Client:

var protocolSetup = new Zyan.Communication.Protocols.Ipc.IpcBinaryClientProtocolSetup(Versioning.Lax);
                _zyanConnection = new ZyanConnection(protocolSetup.FormatUrl("IPCZeit", "Zeit"), protocolSetup);

Server:

var protocolSetup = new Zyan.Communication.Protocols.Ipc.IpcBinaryServerProtocolSetup("IPCZeit", Versioning.Lax);
            _zyanComponentHost = new ZyanComponentHost(name, protocolSetup);

Aber auch die Änderung brachte keine Lösung 🤔

@Abt:

  1. Da habe ich wohl einen groben Fehler übersehen. Aber in meinem letzten Beitrag war es schon korrigiert 8)
  2. GetZeit(); wird im Server im Program.Main aufgerufen.