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.
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);
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
Nein, daran liegts nicht, habs gerade ausprobiert. Hätte mich auch sehr gewundert, da ich eigentlich auch der Meinung von Peter bin.
Gruß, Christian.
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
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.
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.