Užduočių klasė
Užduočių klasė yra asinchroninė operacijų abstrakcija, pateikiama po .NET 4.0, su visu keliu į System.Threading.Tasks.Task.
Task klasė naudojama asinchroninėms operacijoms be grąžinamos reikšmės pavaizduoti, o asinchroninėms operacijoms su grąžinamomis reikšmėmis turėtų būti naudojamas Task klasės poklasis Task<TResult>. Užduočių klasės sukurtos užduotys įtraukiamos į gijų telkinį.
<TResult>Pagrindiniai Task/Task klasės konstruktoriai yra šie:
Sukūrus užduotį galima pradėti naudojant Start() metodą:
Kuriant ir pradedant naujas užduotis, statinis Task klasės metodas Run() arba gamyklinės klasės TaskFactory nario metodas StartNew() dažniau naudojamas naujoms užduotims kurti ir pradėti.
Keletas įprastų užduočių klasės metodų:
Raktažodis asinchroninis / laukti
C# 5.0 pristatė asinchroninius ir laukimo raktažodžius, kurie geriau palaikė sutapimą kalbos lygiu.
Async naudojamas asinchroniniams metodams pažymėti: Asinchroninis raktažodis yra kontekstinis raktažodis ir bus traktuojamas kaip raktažodis tik keičiant metodą ir Lambda, o kitose srityse bus traktuojamas kaip identifikatorius. Asinchroninis raktažodis gali žymėti statinius metodus, bet ne įėjimo taškus (Main() metodus).
Metodo, pažymėto asinchronizacija, grąžinama reikšmė turi būti <TResult>Užduotis, Užduotis arba Void. "Await" naudojamas laukti asinchroninio metodo rezultato:
Laukimo raktažodis taip pat yra kontekstinis raktažodis ir laikomas raktiniu žodžiu tik asinchroniniu pažymėtu metodu. Raktažodis laukti gali būti naudojamas prieš asinchroninį metodą ir Užduotis bei <TResult>Užduotis, laukiant asinchroninės užduoties vykdymo pabaigos. Paprasta asinchroninio metodo struktūra yra tokia:
Nėra taip, kad metodas pažymėtas asinchroniniu raktažodžiu, tai yra asinchroninis metodas, o teiginiai, kurie rodomi tiesiai asinchroninio metodo viduje, taip pat vykdomi sinchroniškai,Asinchroniškai vykdomas turinys turi būti vykdomas naudojant užduočių klasę。 Tiesą sakant, asinchroninis metodas, kuriame nėra jokių laukimo sakinių, bus vykdomas sinchroniškai, tada kompiliatorius pateiks įspėjimą.
Paprastas pavyzdys, naudojant asinchroninį / laukti išvesti turinį vienu metu ekrane:
Išvestis: (Mono 4.4.0 ir ArchLinux x64)
Iš aukščiau pateiktos programos nesunku pastebėti, kad asinchroniniame raktažodyje pažymėtas asinchroninis metodas, kodas prieš naudojant await vykdomas sinchroniškai, o iškvietus await likęs kodas veikia asinchroniškai atskiroje gijoje.
|