NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Špiónská aplikace v C# - Server - 2.díl

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Martin Dráb
Tvůrce
Avatar
Martin Dráb:23.4.2016 23:37

Nevím, proč často vidím tento obrat:

if (podminka)
  return true;
else return false;

Proč není lepší napsat prostě:

return (podminka);

Jinak se mi zdá, že by také bylo rozumné, aby odesílací vlákno nezatěžovalo procesor, když nemá co na práci. Tady to vypadá, že "nikdy nepsí". Přitom by v C# určitě měly být implementované semafory. Pak tam ještě bez zámku saháš na položku tasks.count, ale to v tomto případě asi vadit nebude.

Pokud bude mít odesílací vlákno hodně práce (dlouhou frontu úkolů nebo časově náročné úkoly), volání metody Send zablokuje ostatní (protože jednotlivé úkoly jsou vykonávány pod zamknutou kolekcí). Ale tohle je spíš otázka výběru, co člověk chce. Opačný extrém také nemusí být zrovna dobrý.

Odpovědět
23.4.2016 23:37
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
David Podeszwa:24.4.2016 10:02

Možná proto že dost lidí neví že vlastně sama podmínka v závorce vrací bool. Jinak C# semafory má ale jejich použití se teda mně zdá chaotické a navíc pokud jsi to myslel použít na to že by odesílací vlákno spalo do té doby dokud mu nepříjde další Task tak na tohle já hoodně používám ManualResetEvent příklad použití:

public class Trida
    {
        //Vytvoří instanci ManualResetEvent s počátečním stavem na false
        ManualResetEvent mre = new ManualResetEvent(false);

        public void Vlakno1()
        {
            while (true)
            {
                //Vykoná nějaký kod
                int i = 1 + 1;
                //Počká na nejake jine vlakno ktere mu rekne ze muze pokracovat
                mre.WaitOne();
                //Take se muze pouzit mre.WaitOne(int); kde integer jako parametr je počet milisekund po kterem se thread vzbudi pokud ho nikdo nevzbudil manualne
            }
        }
        public void NejakaMetoda()
        {
            //Tady jednoduse probudime Vlakno1 ze "spanku"
            mre.Set();
        }
    }

Je to pouze příklad já toto používám často hodí se to při různých asynchronních operacích

Editováno 24.4.2016 10:03
 
Odpovědět
24.4.2016 10:02
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na David Podeszwa
Martin Dráb:24.4.2016 10:45

ManualResetEvent se hodí, pokud potřebuješ indikovat, že se něco stalo (obvykle něco, co se tak úplně libovolně neopakuje). Kdo ji resetuje do nesignálního stavu (stavu, kdy WaitOne čeká)?

Ohledně fronty by spíš bylo lepší použít samoresetující se eventu, což je v podstatě binární semafor, ta manuální je lehce nebezpečná.

Odpovědět
24.4.2016 10:45
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
David Podeszwa:24.4.2016 13:45

No to máš asi pravdu já fronty takhle jak on nepoužívám já jsem si udělal na Tcp komunikaci vlastní splácanou knihovnu jak serverovou tak klientskou přímo s pomocí Socketů a při každém posílání si věci zamykám a pokud z venčí posílám velké soubory tak si to většinou rozkouskuju a posílám postupně

 
Odpovědět
24.4.2016 13:45
Avatar
jiri.sada
Tvůrce
Avatar
jiri.sada:27.4.2016 16:21

Stále mi neschválili druhou část tohohle článku :-(

 
Odpovědět
27.4.2016 16:21
Avatar
jiri.sada
Tvůrce
Avatar
Odpovídá na Martin Dráb
jiri.sada:27.4.2016 18:08

K metodě Send: Je mi to jasné, ale to měl být záměr, aby se jednotlivé věci zařadily za sebe a posílaly se přesně v pořadí, jak volám Send

 
Odpovědět
27.4.2016 18:08
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na jiri.sada
Martin Dráb:27.4.2016 19:41

To podle mě nic nemění na tom, že se zamyká po zbytečně dlouhou dobu. Ono by stačilo, kdyby vlákno obsluhující požadavky na odeslání pracovalo následovně:

  1. zamklo,
  2. odebralo požadavek z fronty,
  3. odemklo,
  4. zpracovalo požadavek.

Fronta (implementovaná kolekcí) zajistí, že se požadavky budou zpracovávat v pořadí příchodu a zároveň se zbytečně nebude blokovat volání metody Send.

Samozřejmě to může vést k extrému, že fronta naroste do neuvěřitelných rozměrů, pokud je snaha odeslat víc požadavků, než vlákno stíhá zpracovávat, ale vše má holt své výhody a nevýhody. A pořád se to dá ještě nějak řešit; tam už hodně záleží, co konkrétně je potřeba.

Odpovědět
27.4.2016 19:41
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.