C# multithread server

C# multithread server
2015-03-29T08:16:08+02:00
2015-03-29T15:38:25+02:00
2022-12-02T08:41:52+01:00
Tomikapc
Sziasztok!
Először is, jó régen jártam itt, de örülök, hogy még mindig ilyen jól működik ez az oldal :)

C#-ban szeretném kicsit segítségeteket kérni.
A részfeladat, ahol elakadtam kicsit az az, hogy legyen egy szerver alkalmazásom, ami új szálat nyit a klienseknek és ezeknek a klienseknek bármikor le tud szólni.
A koncepcióm az volt, hogy készítek egy singleton ConnectionManager és egy HandleClient osztályt, amit minden bejövő kérésnél példányosít majd és elindít neki egy szálat. A ConnectionManagerben pedig egy hashtable-ben connectionId alapján eltárolom a socketeket. Készítek egy SendMessage metódust, amely az üzenetet várja és a connectionId-t ez alapján tud kiírni a streamre.

A kérdésem az, hogy alapján véve ez egy jól működő elgondolás? Lehet szebben? Minden szál ugyanazt a ConnectionManager osztályt fogja látni?
Implementáltam ezt a megoldást. Forráskód: linkA Games is egy singleton hasonlóan.
A probléma az, hogy ha kiveszem, hogy szálban fusson, tehát a handle metódusban csak egy start()-ot hívok, akkor a csatolt képen látható exceptiont dobja, amikor egy kliens csatlakozik.

Ha hagyom, hogy új szálban fusson, akkor az a probléma, hogy láthatóan a start metódus kiszól a Game-nek, hogy adduser, ez le is fut, majd az visszaszólna a ConnectionManagernek, ez azonban már nem történik meg.

Games

public void AddUser(User pUser) { usersList.Add(pUser); Console.WriteLine("alma"); ConnectionManager.Instance.foo(); Message<User> m = new Message<User> {Code = "updateUser", Objects = pUser}; ConnectionManager.Instance.SendMessage(m,pUser.connectionId); }
Tehát ez az utolsó sor nem fut le. Ennek tesztelésére hoztam létre a ConnectionManager-ben a foo metódust, de az sem fut le ha innen hívom meg. 



Köszönöm annak, aki végigolvasta. Ha alapjában véve rossz ez az elgondolás, akkor nem kell ezt kijavítani persze, nagyon szívesen fogadok más javaslatokat.
Mutasd a teljes hozzászólást!
Csatolt állomány
A hibák meg nem várt működés lényege az ConnectionManager.instance-ban keresendő:

Ha nem szálban kezeled a usert, akkor instance mindig null lesz, mivel a konstruktorban benne vagy ragadva és a lock ezen nem fog segíteni, mivel egy szálad van és pofátlanul létrehozza az újabb ojjektumot, ami ugye kivétellel jár.

Ha meg szálban kezeled usert, akkor is null lesz instance, csak ott meg szépen megfogja a lock  a végrehajtást, mivel a konstruktorban még mindig be vagy ragadva.


...

Szóval hirtelen csak annyit tudok tanácsolni, hogy tedd külön metódusba a kliensek fogadását kezelő ciklust - és persze ne a konstruktorból hívd meg.
Mutasd a teljes hozzászólást!

  • Feltettem ide az egész source-ot, ha úgy könnyebb:
    uno.rar
    Mutasd a teljes hozzászólást!
  • A hibák meg nem várt működés lényege az ConnectionManager.instance-ban keresendő:

    Ha nem szálban kezeled a usert, akkor instance mindig null lesz, mivel a konstruktorban benne vagy ragadva és a lock ezen nem fog segíteni, mivel egy szálad van és pofátlanul létrehozza az újabb ojjektumot, ami ugye kivétellel jár.

    Ha meg szálban kezeled usert, akkor is null lesz instance, csak ott meg szépen megfogja a lock  a végrehajtást, mivel a konstruktorban még mindig be vagy ragadva.


    ...

    Szóval hirtelen csak annyit tudok tanácsolni, hogy tedd külön metódusba a kliensek fogadását kezelő ciklust - és persze ne a konstruktorból hívd meg.
    Mutasd a teljes hozzászólást!
  • Elég kezdő hiba, nem vettem észre, és sosem jöttem volna rá...
    Köszönöm szépen, hogy kiszúrtad.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd