Asynchronní metody – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Asynchronní metody – .NET – Fórum – Programujte.comAsynchronní metody – .NET – Fórum – Programujte.com

 

RePRO0
Super člen
8. 5. 2012   #1
-
0
-

Zdravím,

od veškerých odborníků v branži IT jsem dostal různé odpovědi. Byl bych rád, kdybych si to mohl už konečně nějak reálně sjednotit a mohl na to koukat z jednoho úhlu.

Potřebuji přesně vědět, jak fungují asynchronní metody BeginReceive a EndReceive na socketové bázi. Setkáme se tedy s následujícími metodami:

  • BeginReceive,
  • EndReceive,
  • Callback.

Jde mi o celý postup principiálně:

  • co běží v hlavním vlákně, co v pracovním, 
  • jakým způsobem, kdy a proč se volá callback, 
  • jaké metody (viz. nahoře) jsou blokované, a které nejsou, 
  • pokud zavolám metodu Send, na co bude směřovat.

Nejvíc bych uvítal postup v rámci kroků, to jest:

  1. zmáčkneme spojku,
  2. zařadíme rychlost,
  3. pouštíme spojku, přidáváme plyn.

Pokud bude k mání i nějaký náčrt (image), další věc, co pomůže.


Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
KIIV
~ Moderátor
+43
God of flame
8. 5. 2012   #2
-
0
-

Principialne:

Hlavni vlakno se stara o beh programu + vetsinou nejaky hlidani threadu a podobne

Callback je jen funkce, ktera se ma provest s daty, ktere prisly po siti (jindy se tomu rika i handler) - a obvykle to bezi v pracovnim threadu (nejcasteji mas thread poll - tj. nastavitelny pocet pracovnich threadu, ktere jen vybiraji data z nejake vstupni fronty) - pripadne se muze spoustet novy thread po kazdem requestu - ale to nejde pro prilis velke mnozstvi requestu naraz - umi to pekne vyzrat veskery systemovy zdroje

Kdyz neco "blokuje" dokud se neobjevi nejaka udalost, pak je to synchronni - proste ceka na udalost. Asynchonni na nic neceka - muze se pak delat vic veci i jednim vlaknem (obsluha obrazovky, vicero socketu.. whatever)

Send ocekava socket s nastavenou adresou - pak je jeste napriklad SendTo kde se muze dat i neotevreny socket a adresa kam se ma posilat

Nahlásit jako SPAM
IP: 62.245.85.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
8. 5. 2012   #3
-
0
-

Zkusim to taky trochu popsat.

Hlavní vlákno - je vlákno, na kterým běží celá app a pokud vtyvoříš nějaký vlastní vlákna nebo async metody, tak se vytvářejí subvlákna (vedlejší vlákna)

Vedlejší vlákno - Tvoje vlákna nebo async metody, pokud je ukončíš, tak app bude stále běžet, protože ta má vlastní (hlavní) vlákno

Tohle si můžeš představit jako nějakej kabel třeba koaxial, kde uprostřed je hlavní vlákno a je obalenej vedlejšími

Synchronní metoda je klasická metoda... taková metoda po zavolání blokne program do doby, dokud neskončí

Asynchronní metody je trochu jiná, po zavolání se na pozadí vytvoří vlákno, ve kterým běží a po skonšení metody se vlákno dealokuje.. takže program nečeká na skončení metody, ale pokračuje dál

BeginReceive - má nějaký parametry a jeden parametr je callback, callback volá název metody, která se má chovat jako asynchroní

EndReceive - volá se v callback funkci na async result parametr a ukončuje async volání.. ale na konci této callback funkce je nutné opět zavolat BeginReceive (callback metoda volá sama sebe), aby se tato metoda zavolala opět async

callback - sice jsem již zmínil, ale callback metoda je taková metoda, která se volá asynchroně (volá sama sebe přes BeginReceive)

Co je blokovaný a co ne jsem napsal jako první a metoda Send.., tato metoda může volat BeginWrite asynchroně, ale nebude se chovat jako callback, protože data pouze zapíše do streamu, ale nezavolá se znovu už

Doufám, že už je to trochu jasný =)

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
RePRO0
Super člen
9. 5. 2012   #4
-
0
-

Zdravím,

děkuji oboum za vysvětlení.

Pokud tedy zavoláme metodu Send a odešleme data, jak probíhá asynchronní přijímání dat (bytů)? Především mě zajímá, jak bude pracovat trojice metod BeginReceive, EndReceive a Callback.

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
ingiraxo+15
Grafoman
9. 5. 2012   #5
-
0
-

Já teď nevim, jestli myslíš nějakou metodu Send tvoji nebo už v tom API, pokud tvoji, tak ano, může být asynchronní a fungovat tak, jak jsem napsal, ale defaultně bude synchronní (pouze zapisovat do streamu)

A nevim co chceš přesně vědět, mám dojem, že jsme ti napsali k čemu jsou ty metody a jak fungojou

A Callback není metoda ale jen označení metody, že probíhá asynchronně a na konci volá sama sebe

Nahlásit jako SPAM
IP: 195.113.126.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
RePRO0
Super člen
9. 5. 2012   #6
-
0
-

Myslím tím metodu Send, která je už klasicky v API. Tato metoda je synchronní... nemusí být asynchronní. 

No, nejspíš jsem to myslel takto:

  1. Metoda BeginReceive vrací IAsyncResult a čeká na data;
  2. Pokud to vrátí (nastala událost - přišly data), zavolá se callback;
  3. Jedním z parametrů callbacku je IAsyncResult, kde si to vyzvedneme (jde vlastně o return BeginReceive);
  4. Zavoláme int receiveBytes = sock.EndReceive(asyn);
  5. Tím si přečteme, kolik jsme dostali bytů na socketu;
  6. V případě potřeby počkáme na další data (znovu BeginReceive).

Správná domněnka?

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
ingiraxo+15
Grafoman
9. 5. 2012   #7
-
0
-

#6 RePRO
A co ti brání si napsat vlastní metodu Send, která bude asynchroní, pokud jí teda chceš mít aync

Jinak takto nějak by to mohlo fungovat, jen bych dodal, že u toho 6. bodu, se BeginReceive musí zavolat vždy, pokud jde o callback, nevolá se pouze v případech, kdy se třeba klient odpojil, protože BeginReceive přijímá od každého klienta (soketu) zvlášť

PS: V C# 5.0 budou klíčový slova wait a async, který jednoduše nastavějí metodu na asynchronní, takže tenhle problém (nebo spíš komplikovanější řešení) se bude moct obejít

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
CZechBoY+4
Věrný člen
9. 5. 2012   #8
-
0
-

já používám normálně BeginSend

Nahlásit jako SPAM
IP: 213.192.10.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý