Нетните, чакат методи за изпълнение на задачи

В примерите на предишна статия основната нишка на изпълнение, по същество метод Main (), завършена, защото този резултат е гарантиран призовава метод Thread.Sleep (). Но този подход не е задоволително.

Организирайте чака задачи могат да бъдат изпълнени и по перфектен начин, като се използват методи за режим на готовност, специално предвидени в Задача клас. Най-простият от тях се счита за Изчакайте метод (). за спиране на изпълнението на нишката разговори до тогава, до приключване на задачата по призвание.

При изпълнение на този метод може да се генерира от две изключения. Първият от тях е ObjectDisposedException на изключване. Той се генерира ако задачата е освободен, като се обадите Изхвърлете (). Втори изключение, AggregateException. Той се генерира, когато самата задача хвърля изключение или се отменя. Като правило, това се следи и се обработва от това изключение.

Поради факта, че проблемът не може да генерира изключение, ако, например, са събрани в периода на проблема, всички такива изключения се събират в един-единствен вид елиминиране AggregateException. За да се разбере какво наистина се е случило, е достатъчно да се анализира вътрешната изключение, свързано с натрупване изключение. До тогава, в следните примери, никакво изключение, генерирани от задачите ще бъдат обработени по време на изпълнение.

По-долу е версия на програмата от предишната статия, променен, за да се демонстрира прилагането на метод, изчакайте () на практика. Този метод се използва в метода Main (), за да спира изпълнението, докато, докато приключи и двете задачи task1 и task2:

Нетните, чакат методи за изпълнение на задачи

Както следва от горния резултат, ефективността на метода на Main () трябва да бъде спрян, докато приключи, докато и двете задачи task1 и task2. Все пак трябва да се има предвид, че в тази програма е поредица от завършване задачи задача и task2 не е от голямо значение за метода на повикване Изчакайте (). Така че, ако първата задача е завършена task2, методът се обадя task1.Wait () все още се очаква завършване task1 задача. В такъв случай, методът на повикване task2.Wait () ще се изпълни и да се върне незабавно от него като task2 задача е завършена.

В този случай две повиквания е достатъчно, изчакайте (метод), но същият резултат може да се постигне по по-прост начин, като се използва метод WaitAll (). Този метод организира група в очакване на приключване на задачите. Завръщане от това няма да стане, докато всички задачи са завършени.

Задачи, които изискват завършване очаква параметър се предават чрез задачи масив. И тъй като този параметър се отнася до вида на Поколения назад, а след това този метод може да бъде отделно мине масив от обекти от тип Задача или списък със задачи. Това може да се генерира от различни изключения, включително AggregateException.

Организиране чака завършването на няколко задачи трябва да бъдат особено внимателни, за да се избегне мъртвите зони. Например, ако две задачи в очакване на приключването на всяка друга, а след това на метода на повикване WaitAll () не води до връщане от него.

Разбира се, условията за мъртвите зони се появят в резултат на програмни грешки, за да бъдат избегнати. Ето защо, ако методът на повикване WaitAll () не се връща от това, че е необходимо да се анализира внимателно дали два гола или повече уширението. (Calling Изчакайте (), която не води до връщане на него, също може да доведе до задънена улица).

Задачи, които изискват завършване очакваното, предавани чрез параметър масив обекти такива задачи Task Задача списък или отделни аргументи тип. Този метод връща индекса на проблема, който завърши на първо място. Това може да се генерира от различни изключения. Опитайте WaitAny () метод на практика, чрез заместване на следния разговор в предишната програма:

Сега, прилагането на метода Main (), за да се възобнови и програмата приключи, веднага след като един от двата ни задачи. В допълнение към формите са взети предвид тук методи Изчакайте (), WaitAll () и WaitAny (), има и други варианти от тях, които могат да бъдат определени период на престой или запис знак за оставка.

Изхвърлянето () метод

Изхвърлете () метод се прилага в класа на Task, освобождавайки ресурси, използвани от този клас. Обикновено, средствата, свързани с класа Task, освободени автоматично по време на "събиране на боклука" (или в края на програмата). Но ако трябва да се освободи, дори и по-рано, за тази цел метод на Изхвърлете () тези ресурси. Това е особено важно в тези програми, които генерират голям брой задачи, за да бъдат оставени да се грижат сами за себе си.

Все пак трябва да се има предвид, че методът на Изхвърлете () може да се нарече с конкретна задача само след неговото приключване. Ето защо, за да се изясни факта, завърши конкретна задача преди да се обадите метод Изхвърлете () ще изисква някакъв механизъм, например, метод на разговор Изчакайте (). Ето защо методът на Изчакайте () е считана за толкова важно да се обсъди преди метод Изхвърлете (). Ако се опитаме да се обадя Изхвърлете () за още активни задачи ще бъдат изхвърлени InvalidOperationException.