SocketAsyncEventArgs mehrere oder eine Instanz?

  • C#
  • .NET (FX) 4.5–4.8

    SocketAsyncEventArgs mehrere oder eine Instanz?

    Hallo,

    ich bin mich aktuell ein wenig mit den XXXAsync() Methoden der Socket Klasse am Auseinandersetzen.
    Bin dabei eine kleine TCP Netzwerk Engine zu basteln und würde da gerne auf die SocketAsyncEventArgs zurückgreifen, da alles andere m.M.n. mit Error Handling einfach unsauber ist. mit dem BeginXXX() Zeugs MÜSSEN Exceptions fliegen um ordentlich zu detektieren ob Clients disconnected sind oder was auch immer. Außerdem finde ich die Arbeit mit den SocketAsyncEventArgs wesentlich eleganter und bringt mehr Möglichkeiten.

    Nur hab ich jetzt ein paar Dinge noch nicht ganz verstanden. Zum Beispiel bin ich jetzt gerade am Punkt wo das Verbinden klappt, danach wird das Empfangen gestartet und alles wird empfangen wie es soll wenn Daten in den Stream geschrieben werden. Es besteht also eine Receive Loop.

    Jetzt zum Problem, wenn ich jetzt DisconnectAsync, dann bekomm ich diese Exception: An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance.
    Da stellt sich mir die Frage wie man in diesem Fall denn sauber Disconnected. Ich habe auch schonmal Projekte gefunden wo für die verschiedenen Operationen (Connect, Receive, Send) mehrere SocketAsyncEventArgs Instanzen erstellt wurden. Das hab ich dann auch mal probiert: Eins zum Connecten, und eins zum Empfangen.

    Jetzt wollte ich dann das zum Connected benutzen um zu Disconnecten. Dann schmeißt mir aber ConnectAsync eine ObjectDisposedException obwohl der Code da schon längst dran vorbei ist.
    Mir ist jetzt nicht bewusst, wie ich hier das Receiven unterbreche um sauber Disconnecten zu können. Ich hab auch mal gesehen, dass sich einer gedacht hat, das DisconnectAsync überbewertet wird und hat das Socket einfach geShutdown(Both)ed und dann Disposed. Aber das kommt mir alles ziemlich unsauber vor. Seitens MSDN gibt es zu DisconnectAsync auch nicht wirklich viel Dokumentation.
    Weiß hier einer vielleicht um Rat?

    Danke im Voraus