Keresés

Új hozzászólás Aktív témák

  • bpx

    őstag

    válasz Gregorius #1622 üzenetére

    igen, erről is olvastam
    csak átmenetileg oldotta meg a problémát, közben ugyanúgy megszívtam class-szal is

    úgyhogy segítséget kérnék :)

    adott a következő szituáció:
    IIS-en fut egy WCF szolgáltatás, amivel Silverlight kliensek kommunikálnak duplex módon
    (silverlightos sakk, emberek belépnek a szerverre, majd egymás ellen tudnak játszani) - de ez lényegtelen, a konkurenciával van a gond
    (azt szeretném észlelni, amikor meghal egy kliens, hogy a másik játékos ne csak üljön és várjon a semmire, hanem tudjam jelezni neki)
    az ötlet a következő

    a szolgáltatásban van egy
    static List<ClientInfo> clients;
    private static readonly object syncLock = new object();

    ahol

    public class ClientInfo
    {
    public string name; // játékos neve
    public IChessClient client; // callback channel referencia
    public DateTime lastreply; // utoljára mikor jött tőle válasz
    }

    amikor a kliens hív a szerveren egy Login()-t, az csinál neki egy ClientInfo objektumot, és beteszi a listába

    a szolgáltatás statikus konstruktorában csinálok 2 threadet:

    - az egyik pl. 20 mp-ként küld egy kérést a klienseknek (PingRequest())
    ezekre 1-2 mp múlva jön egy aszinkron válasz, mégpedig úgy, hogy a kliensek meghívják a szolgáltatás PingReply() fv-ét, ami bejegyzi a fenti listába, hogy most ebben az időpontban jött utoljára válasz adott klienstől

    - a másik meg pl. 60 mp-ként ellenőrzi a fenti clients listát, hogy kik azok, akik már mondjuk 2 perce nem válaszoltak
    ezeket törli a clients listából, az ellenfelüket meg (ha van) értesíti

    ahányszor hozzáférek a clients listához, mindig lock(syncLock)-ot használok a kölcsönös kizárás miatt

    tehát 3 fő thread van (végrehajtó, "pingelő", ellenőrző)
    a "végrehajtó" (Login(), PingReply()) csak ír
    a "pingelő" csak olvas, és mindig helyes értéket lát
    a probléma az ellenőrző threaddel van, ez olvassa és módosítja is a clients listát

    ha csak 1 kliens van bejelentkezve, akkor minden megy rendben
    ha több, akkor 1 db kliensnél nem látja a ClientInfo.lastreply aktuális értékét, hanem csak a létrehozáskori értéket (Login()) látja - viszont az összes többi kliensnél látja a friss értékeket
    ez az 1 db ugye nem frissül, ha letelik X perc, a szerver úgy veszi hogy halott, törli
    ilyenkor megint lesz 1 db másik, akinél nem látja az ezután érkező friss értékeket, őt is kiszórja
    és ez így megy tovább, egyesével kiszór mindenkit amíg csak 1 játékos marad az egész szerveren, úgy hogy közben mindenki szépen válaszolt és folyamatosan volt kommunikáció, "ping"-re is jöttek válaszok

    ha esetleg valaki eljutott volna idáig az olvasásban (:D), [link] van kód is, csupaszítva, csak a lényeget meghagyva

Új hozzászólás Aktív témák

Hirdetés