Keresés

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

  • joysefke

    veterán

    LOGOUT blog

    válasz ReSeTer #9827 üzenetére

    Bontsuk kétfelé a kérdést. Vagy amit megértettem belőle:

    1,
    Akarsz valami UI-t csinálni, ami user inputra reagál, csinál valamit és visszajelzést ad.
    Nem tudod hogyan kéne a UI-t létrehozni, strukrurálni, úgy hogy aztán később "egy másik metódustból" hozzáférj adott UI elemekhez?
    UI-hoz nem szólok hozzá.

    2,
    Van egy fő végrehajtási szálad és nem tudod hogyan kéne egy "jól definiált feladatot" nem a fő szálon végrehatjani hanem onnan a háttérbe delegálni úgy hogy a háttérben az megtörténjen, mellékhatásokat tudjon létrehozni, pld üzenetet tudjon küldeni vagy mondjuk meglegyen a visszatérési értéke?

    A "jól definiált feladatodat" ki kell szervezned. Legegyszerűbben egy metódusba amire aztán hivatkozni tudsz.

    void Something(p1, p2, ..) { .. }

    aztán ezt ahelyett hogy a fő szálon meghívnád ezt a Something(..)-et, delegálod a végrehajtását a threadpoolnak. Ezt a Task.Run(..) nal teszed meg és paraméterként átadsz egy delegate-et amelyik hivatkozik a metódusodra.

    Tehát a fő szálon ahonnnan delegálsz :
    p1 = ...;
    p2 = ...;
    var t = Task.Run(() => Something(p1, p2, ..))
    // fő szál nincsen blokkolva, a 't' visszatérési érték referencia a Task objektumra amibe a delegált feladatod csomagolva lett.

    Ebben a példában a "Something" egy visszatérési érték nélküli metódus, tehát mellékhatásokkal operál.

    Ha azt szeretnéd, hogy egy másik kódrészlet értesítést kapjon a "Something"-ben történtekről, pld hogy az éppen hol tart, akkor ezt a Something-nek átadott paramétereken kerszül tudod legegyszerűbben megtenni. Paraméterként átadsz egy delegate-et amit a "Something" fel tud hívni mintegy üzenve a külvilágnak.

    pld átadsz neki egy Progress<T>-t paraméterként ezen keresztül pedig a Something vissza tud jelezni a Progress<T> gazdájának. (A Progress<T> egy Action<T> delegatet csomagol be, UI kompatibilis módon.)

    Something(p1, p2, .., IProgress<int> progress)
    {
    progress.Report(0);

    Thread.Sleep(1000) // CPU work
    progress.Report(50);

    Thread.Sleep(1000) // CPU work
    progress.Report(100);
    }

    [ Szerkesztve ]

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