Private Property

  • C#
  • .NET (FX) 4.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Private Property

    Moisen,
    ich hab da ein kleines Problemchen..

    undzwar habe ich einen WebSocket-Server geschrieben in C# (Alchemy Library) und möchte per Klick auf einen Button eine Nachricht an den verbundenen Client senden.

    dazu muss man normalerweise der Funktion mitteilen welcher Client verbunden ist - dies geschieht hier im Normalfall über den sogenannten UserContext.

    Bsp:

    C#-Quellcode

    1. public static void OnReceive(UserContext aContext)
    2. {
    3. try
    4. {
    5. MessageBox.Show("Data Received From [" + aContext.ClientAddress.ToString() + "] - " + aContext.DataFrame.ToString());
    6. }
    7. catch (Exception ex)
    8. {
    9. Console.WriteLine(ex.Message.ToString());
    10. }
    11. }


    Da der Click auf einen Button allerdings ein Event ist kann

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)

    nicht einfach in

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e, UserContext aContext)

    verändern. Da hab ich dann den Tipp mit Private Property bekommen und das gleich mal nachgeschaut
    allerdings bin ich da zu keinen funktionierdem Ergebniss gekommen.
    In der Klasse habe ich das eingefügt:

    C#-Quellcode

    1. public partial class WebSocket : Form
    2. {
    3. private UserContext aContext { get; set; }
    4. public WebSocket()
    5. {
    6. InitializeComponent();
    7. }
    8. [....]


    Nun stürtzt das Programm beim Klick auf den Button einfach ab.

    MfG :)
    @SykesXablex
    Du musst den UserContext setzen, bevor Du ihn benutzen kannst, ansonsten ist der null.

    C#-Quellcode

    1. public WebSocket()
    2. {
    3. InitializeComponent();
    4. aContext = bla;
    5. }
    Wo der herkommt, kann ich Dir leider nicht sagen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier man das Beispiel von der WebSite der Library:

    C#-Quellcode

    1. //...refs
    2. using Alchemy;
    3. using Alchemy.Classes;
    4. static void Main(string[] args)
    5. {
    6. // instantiate a new server - acceptable port and IP range,
    7. // and set up your methods.
    8. var aServer = new WebSocketServer(81, IPAddress.Any) {
    9. OnReceive = OnReceive,
    10. OnSend = OnSend,
    11. OnConnect = OnConnect,
    12. OnConnected = OnConnected,
    13. OnDisconnect = OnDisconnect,
    14. TimeOut = new TimeSpan(0, 5, 0)
    15. };
    16. aServer.Start();
    17. }
    18. static void OnConnected(UserContext context)
    19. {
    20. Console.WriteLine("Client Connection From : " +
    21. aContext.ClientAddress.ToString());
    22. }
    23. //...etc


    Hoffe das wird daraus erkenntlich..
    Okay etwas anderer ansatz: Wenn ein Client connected wird noch eine andere Klasse aufgerufen und beim aufruf wird der UserContext mit übergeben und ist dann in der ganzen Klasse nutzbar...

    C#-Quellcode

    1. public partial class HookTestForm : Form
    2. {
    3. [....]
    4. public static void OnConnect(UserContext aContext)
    5. {
    6. MessageBox.Show("Client Connected From : " + aContext.ClientAddress.ToString());
    7. // Create a new Connection Object to save client context information
    8. var conn = new Connection { Context = aContext };
    9. // Add a connection Object to thread-safe collection
    10. //OnlineConnections.TryAdd(aContext.ClientAddress.ToString(), conn);
    11. }
    12. [....]
    13. }
    14. public class Connection
    15. {
    16. public System.Threading.Timer timer;
    17. public UserContext Context { get; set; }
    18. public Connection()
    19. {
    20. // this.timer = new System.Threading.Timer(this.TimerCallback, null, 0, 1000);
    21. }
    22. private void TimerCallback(object state)
    23. {
    24. try
    25. {
    26. // Sending Data to the Client
    27. // Context.Send("[" + Context.ClientAddress.ToString() + "] " + System.DateTime.Now.ToString());
    28. }
    29. catch (Exception ex)
    30. {
    31. Console.WriteLine(ex.Message);
    32. }
    33. }
    34. }


    Theoretisch könnte ich das auch hier mit dem Button irgendwie machen nur kann ich den nicht 'ansprechen' da er ja in der anderen Klasse erstellt wurde (ist das so richtig? weiß selbst nicht so genau woran das liegt)
    Nun die eigentliche Frage ist ja wie ich beim auslösen eines Events wie zB den ButtonClick eine Nachricht per WebSocket schicke.
    Nun wird dafür ja der 'UserContext' benötigt und dieser muss vorher irgendwie mit übergebene oder deklariert werden..
    Wie sieht sowas aus? Wenn ich einfach

    C#-Quellcode

    1. public partial class HookTestForm : Form
    2. {
    3. public string aContext;
    4. [....]


    &

    C#-Quellcode

    1. public static void OnConnect(UserContext aContext)
    2. {
    3. MessageBox.Show("Client Connected From : " + aContext.ClientAddress.ToString());
    4. // send(aContext, "connect");
    5. // Create a new Connection Object to save client context information
    6. var conn = new Connection { Context = aContext };
    7. aContext = UserContext;
    8. // Add a connection Object to thread-safe collection
    9. //OnlineConnections.TryAdd(aContext.ClientAddress.ToString(), conn);
    10. }


    schreibe geht das nicht da UserContext ein Typ ist aber wie eine Variable verwendet wird.
    Doch, prinzipiell geht das schon, nur: welchen Datentyp hat bei dir die Klassenvariable aContext?
    Und welchen Datentyp hat das aContext, was beim OnConnect() angeliefert wird?
    Die sollten schon zueinander passen.

    Ui - du scheinst einen Datentyp gar nicht von einer Variablen unterscheiden zu können (das sagt ja auch die Fehlermeldung).

    Weist du, was eine Deklaration ist? Das ist, wenn eine Variable eingeführt wird, und dabei muss immer auch ihr Datentyp angegeben sein.
    Also in zeile #1 in der Klammer, das ist zB eine Deklaration: UserContext aContext Was davon ist Datentyp, und was ist die Variable?

    Und eiglich wolltest du doch den Context in der Klassenvariable (weiter oben deklariert, aber falsch) speichern - aber die Klassenvariable taucht im Snippet ja garnet auf!
    stattdessen die unsinnige Verwendung eines Typs als Variable.

    ich geb dir noch ein Versuch, dann musses halt jmd anners für dich hinschreiben.

    SykesXablex schrieb:

    funktionierende Lösung
    Lässt Du uns daran teilhaben?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!