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..
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..
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.
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.
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 |
@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..
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 |
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..
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?
Weißt Du, was Dein Code da tut?
var zeit = zyanConnection.CreateProxy<IZeit>();
zeit.ZeitEvent += (sec) => Console.WriteLine("Client: " + sec);
Console.ReadKey();
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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: