• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    MORMEGIL
    MORMEGIL --- ---
    JACHYMKO: Je fakt, že v tomhle konkrétním případě ani nebylo nikdy explicitně řečeno, že ten singleton má být lazy-initialized. Pokud ne, tak je tvoje původní řešení samozřejmě zcela v pořádku. Pokud ano, tak buď takhle přes beforefieldinit (a rozhodně je lepší to dělat takhle než double-checked lockingem, IMHO), nebo tím Lazy (což je samozřejmě pro nový kód preferované řešení, ale jen .NET 4+).
    MORMEGIL
    MORMEGIL --- ---
    JACHYMKO: Ale chybí ti tam ještě
    static Singleton() {}
    !
    MORMEGIL
    MORMEGIL --- ---
    JACHYMKO: A kdyby náhodou ta třída měla třeba ještě nějaký další statický členy (a strašně moc mi záleželo na skutečně lazy inicializaci), tak použiju to Lazy<T>.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    MORMEGIL: Jo, akorat bude neustale ziskavat a uvolnovat lock. A v pripade ze na ten singleton bude casto sahat, tak se mu ta aplikace bude brzdit sama sebou a to uplne zbytecne.
    MORMEGIL
    MORMEGIL --- ---
    TENCOKACISTROMY: Přesně vzhledem k tomu může jako template vzít a donekonečna používat i tu původní verzi z pastebin.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    MORMEGIL: No vzhledem k tomu, ze se tu bavime o getteru k singletonu a zadny komplikovanosti, tak tohle muze vzit a jako template pouzivat do nekonecna.

    U komplexnejsich grafu (staci mit nejakou hierarchii) to je samozrejme vyrazne slozitejsi. Posednich par mesicu na necem takovym delam, tak o tom mam moc dobrou predstavu :).

    Docela se mi libi pristup immutable typu, tam se tomu lockovani clovek hodne vyhyba.
    MORMEGIL
    MORMEGIL --- ---
    TENCOKACISTROMY: Double-checked locking je problematická konstrukce i u lidí, co tomu rozumějí, natož u těch, co nemají jasno, co tak může zamykat lock v getteru. Rozhodně bych nikomu nedoporučoval jí nahrazovat existující kód. A jestli existující kód nějak upravovat, tak předělat na Lazy<T>.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN: Zkus predtim zavolat "Measure" a pak si precist "DesiredSize".
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    Muzes mit dva pristupy. Budto dotycny objekt nechat jak je, a lockovat si to v metodach, ktery neco delaj. A nebo to bude delat ten objekt sam. Ani jedno z toho neni spasa, protoze v obou pripadech najdes situace, kdy ti to uplne nevyhovuje.
    NECROMAN
    NECROMAN --- ---
    Nejaky tip, jak v Silverlightu implementovat TextBlock, ktery bude zalamovat text na dva radkyu na definouvanou MaxWidth a pokud se tam nevejde, tak zmensi font tak, aby se tam vesel?
    Zkousim velikost fontu vypocitat, ale ActualWidth a ActualHight ukazuje nepouzitelna cisla.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    TENCOKACISTROMY: I sense too much of dynamic side of the force in you....
    URZA
    URZA --- ---
    TENCOKACISTROMY: diky, jen teda jestli to chapu dobre tu posledni vetu.. mam si udelat jeste lock v UpravCosi metode jo? jsem ted z toho nejakej trochu zblblej :) multithreaded programovani je neco co jsem nejak zanedbal a nidky s tim neprisel poradne do kontaktu.. takove me slabe misto.. asi bych si o tom mel neco precist.. :)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    TENCOKACISTROMY: Teda chtel jsem rict:
    Protoze konstantu do promenne si nepriradim takto. V jazycich dynamickych, usetril mi tento pristup debugovani mnoho. Zvyk jsem si tento i do C# prenesl, prestoze jen u bool promennych situace dotycna hrozi.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    SHIGORBIRDMAN: Protoze si pak omylem nepriradim konstantu do promenny. V C# ti to hrozi jen v pripade bool promennych/clenu, ale u dynamickych jazyku mi to uz nekolikrat usetrilo hromadu debugovani.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    STROMYCOKACITEN: proc pouzivas yoda conditional? :)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    URZA: Ten pristup k singletonu udelej takhle:
    public sealed class Singleton {
        private static Singleton instance; // zadny "= null"
        private static readonly object padlock = new object();
    
        public static Singleton Instance {
            get {
                var result = instance;
                if (null == result) { // pro kontrolu na NULL neni potreba lock
                    lock(padlock) {
                        // zkontrolujeme jeste jednou, jestli se pred ziskanim zamku nahodou
                        // uz singleton neinicializoval z jinyho vlakna
                        if(null == (result = instance)) {
                            instance = result = new Singleton();
                        }
                    }
                }
    
                return result;
            }
        }
    }


    Jinak ten lock se vaze pouze na tu statickou property "Instance", ktera vraci odkaz na ten objekt. Na samotny objekt se ten lock nevztahuje.
    URZA
    URZA --- ---
    Ahoj,

    Mam Singleton tridu v multithreaded prostredi, kde v Getu pro vraceni instance je lock

    implementovano takto nejak:

    http://pastebin.com/BfikxUhJ

    Ted by me zajimalo, jestli tim ze pristup k instanci Singleton.Instance je locknuty, tak jestli to zajisti i lock na pristup k vnitrnim vecem (property atd) nebo jestli ten se musi poresit v kazde property zvlast

    Teda treba kdyz by mel ten singleton takovouto metodu:

    private int Cosi {get; set;}

    public bool UpravCosi()
    {
    if (Cosi == 2)
    Cosi = 5;
    }

    tak jestli je to vpohode tim ze ta instance singletonu je lockovana nebo jestli muze vzniknout nekonzistence mezi radkem Cosi == 2 a radkem Cosi = 5 ?

    Dik
    NECROMAN
    NECROMAN --- ---
    Trochu si dneska pohravam s Azure, vedeli jste, ze k tomu existuje commandline utilita pro Bash? :)
    Windows Azure Command-Line Tools for Mac and Linux (Linux)
    http://www.windowsazure.com/en-us/manage/linux/other-resources/command-line-tools/
    NECROMAN
    NECROMAN --- ---
    TENCOKACISTROMY: jo vim, jak se disposuje, to jsem jen vcera experimentoval, abych to tam nejak dostal :)
    Problem byl s ceskymi znaky, proto ten StreamReader a XmlReader. Take to hlasilo chybejici namespace, proto ten XmlRoot.
    Prikladem toho souboru:
    http://www.play.cz/radio/cro3-192.asx
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN: To .Path + "\\Resources" bych radeji nahradli pomoci Path.Combine.
    Ten stream by si zaslouzil dispousnout. Idealne ho uzavrit do "using(...){...}". Vytvaret ten serializer dokola asi taky neni potreba.
    V tom souboru je jen ten jeden objekt? Nemusel by ses pak drbat s tim xmlreaderem a root attributem.

    var asxs = new List<AsxModel>();
    var serializer = new XmlSerializer(typeof(AsxModel));
    var path = Path.Combine(Package.Current.InstalledLocation.Path, "Resources");
    var resources = await StorageFolder.GetFolderFromPathAsync(dirPath);
    foreach (var file in await resources.GetFilesAsync()) {
        using(var stream = await file.OpenStreamForReadAsync()) {
            var asx = (AsxModel)serializer.Deserialize(xr);
            asxs.Add(asx);
        }
    }
    


    Nicmene nevidim tam zadnej rozdil v mnozstvi kodu oproti desktopovejm windows.
    Kliknutím sem můžete změnit nastavení reklam