Laden...

Zyan Framework und Events

Erstellt von TheBrainiac vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.351 Views
TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 11 Jahren
Zyan Framework und Events

Hi @ All.

Heute hab ich mal ein bisschen mit dem Zyan Framework rumgespielt.

Habe versucht, das MiniChat-Beispiel-Projekt nachzubauen. Funktioniert aber nicht ganz, da Folgendes passiert:
1.Server startet, alles okay 1.Erster Client startet, User meldet sich an, alles okay, User kann Nachrichten senden und diese werden auch beim User angezeigt. 1.Zweiter Client startet, User meldet sich an 1.Jetzt werden aber alle Nachrichten nur noch beim zweiten Client doppelt (?!) angezeigt, und beim ersten Client gar keine mehr...

Das ist der Code von Client, der mehrmals ausgeführt wird:

m_Connection = new ZyanConnection("tcp://localhost:48879/MessageService");

m_MessageService = m_Connection.CreateProxy<IMessageService>();
m_MessageService.MessageReceived += AppendText;

private void AppendText(string nickname, string message)
{
    if (InvokeRequired)
    {
        Invoke(new Action<string, string>(AppendText), nickname, message);
        return;
    }

    m_tbxChatHistory.AppendText(String.Format("[{0}] {1}{2}", nickname, message, Environment.NewLine));
}

private void btnSendMessage_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(x =>
    {
        m_MessageService.SendMessage(m_NickName, GetTextAndClear());
    });
}

Hier der Server (Konsolen-Anwendung)

using (ZyanComponentHost host = new ZyanComponentHost("MessageService", 48879))
{
    host.RegisterComponent<IMessageService, MessageService>(ActivationType.Singleton);

    Console.WriteLine("Starting Server");

    while (true)
    {
        Console.ReadKey(true);
    }

    Console.WriteLine("Shutting down Server");
}

Und zuguterletzt der Service selbst:

public void SendMessage(string nickname, string message)
{
    Console.WriteLine("[{0}] {1}", nickname, message);

    if (MessageReceived != null)
    {
        MessageReceived(nickname, message);
    }
}

public event Action<string, string> MessageReceived;

Ist m.M.n. genau der gleiche Code wie im Beispiel, nur dass er nicht funktioniert...

Hat jemand eine Idee, warum?

Gruß und danke schonmal, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
A
764 Beiträge seit 2007
vor 11 Jahren

Kann das sein, dass du mit nur

m_MessageService.MessageReceived += AppendText;

das event vom ersten client auf den zweiten umbiegst?

Schon so probiert: ?

m_MessageService.MessageReceived += Action<string, string>(AppendText);
5.941 Beiträge seit 2005
vor 11 Jahren

Hallo Alf

Ich dachte += AppendText ist dasselbe wie wenn du nochmal die Instanz von Action erstellst. Bei dir fehlt noch ein "new ".

Der Kompiler ergänzt automatisch new Action(....

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 11 Jahren

Nein, daran liegts nicht, habs gerade ausprobiert. Hätte mich auch sehr gewundert, da ich eigentlich auch der Meinung von Peter bin.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
3.728 Beiträge seit 2005
vor 11 Jahren
Event Bug in Zyan 2.4

Hallo TheBrainiac,

ich konnte Dein Problem reproduzieren. Es handelt sich offensichtlich um einen Bug in Zyan 2.4. Ich habe den Bug im Issue Tracking System erfasst. Hier kannst Du den Status dieses Bugs verfolgen: http://zyan.codeplex.com/workitem/1852
Bitte entschuldige die Unannehmlichkeiten.

Danke dass Du das Problem gleich im Forum gemeldet hast.

Gruß
Rainbird

3.728 Beiträge seit 2005
vor 11 Jahren
Bug behoben

Hallo TheBrainiac,

der Bug ist nun ab ChangeSet 27989 behoben. Ab Zyan Version 2.4 wurde das Event Handling standardmäßig auf asynchrone Verarbeitung umgestellt. Bis Zyan 2.3 wurden Ereignisse synchron verarbeitet und verhielten sich damit wie lokale Ereignisse. Im Enterprise-Umfeld ist das aber nicht die bevorzugte Methode. Das MiniChat Beispiel wurde aber mit der urspsprünglichen synchronen Ereignisverarbeitung entwickelt.

Bei Verwendung von Zyan 2.4 oder höher muss die synchrone Ereignisverarbeitung explizit eingeschaltet werden. Dies wurde im MiniChat Beispielcode einfach vergessen.

Die synchrone Verarbeitung muss serverseitig mit folgender Zeile eingeschaltet werden:

ZyanComponentHost.LegacyBlockingEvents = true;

Damit läuft das MiniChat Beispiel wieder einwandfrei.

TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 11 Jahren

Danke 😃

Geht jetzt in der Tat einwandfrei!

Geänderter Server-Code:

ZyanComponentHost.LegacyBlockingEvents = true;

using (ZyanComponentHost host = new ZyanComponentHost("MessageService", 48879))
{
    // Alles andere wie oben
}

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`