Асинхронний підхід в Visual C # (Sharp)

При асинхронному підході наш код починає виконання завдання, наприклад читання файлу або отримання записи бази даних, але замість того, щоб очікувати резулати, надає їх отримання і подальшу обробку іншим кодом Асіронное взаємодія є окремим випадком архітектури постаік / споживач, тільки подробиці постачальника приховані Завдання запуску постачальника і надання споживача покладається на розробника

Асинхронная методика, використовувана в усьому інтерфейсі API NET, характерізтся постійністю і легко демонструється за допомогою асинхронного читання файлу У чолі 10 було розглянуто читання файлу або консолі допомогою Сірон методів З таким же ефектом читання файлу або потоку можна було б виконати асинхронно

Асинхронний підхід застосовується, коли ми не хочемо чекати завершення хвилювання завдання Наприклад, уявіть, що завантаження файлу займає 15 секунд, протягом яких ми нічого не робимо, а просто очікуємо закінчення завантаження Пятнадцять секунд може здатися не таким вже й довгим очікуванням, але з точки зору користувача інтерфейсу це досить тривалий період часу Якщо протягом цих 15 секунд програма не відповідає на дії пользателя, то навряд чи він отримає від цього задоволення

Асинхронне читання файлу можна виконати за допомогою наступного коду:

FileStream fs = new FileStream(filename, FileModeOpen) Byte[] data = new byte[200000]

IAsyncResult asyncResult = fsBeginRead(data, 0, dataLength, (lambdaAsync) =&gt {

FileStream localFS = (FileStream) lambdaAsync AsyncState,- int bytesRead = localFSEndRead(lambdaAsync)

string buffer = SystemTextASCIIEncodingASCIIGetString(data) Console WriteLine( &quotBuffer bytes read (&quot + bytesRead + &quot*)&quot)

localFSCloseO

}, fs) asyncResultAsyncWaitHandleWaitOne()

У першому фрагменті коду виконується ініціалізація процесу читання файлу, а в другому – обробка прочитаної інформації

Фрагмент для читання файлу складається з наступного коду: FileStream fs = new FileStream (filename, FileModeOpen) Byte [] data = new byte [200000]

IAsyncResult asyncResult = fsBeginRead(data, 0, dataLength, (lambdaAsync) =&gt {

},fs)

asyncResultAsyncWaitHandleWaitOne()

Як і в прикладах в чолі 10, для читання файлу необхідно відкрити файловий пок Але замість того щоб зчитувати дані безпосередньо, викликається метод BeginRead (), який запускає операцію читання Але асинхронна операція отлается тим, що метод BeginRead () відразу ж повертає керування Це можна розглядати як запуск постачальника

Перші три параметри, передані методу BeginRead (), представляють перемеую, що містить прочитані байти Перший параметр – це масив байтів, в який слід записувати дані Другий і третій параметри представляють початкову та кінцеву позиції в масиві байтів для операції запису Четвертим параметром методу BeginRead () є делегат, який викликається, коли даие готові для обробки Останній параметр схожий на параметр потоку і прваівается члену даних IAsyncResultAsyncState Інтерфейс IAsyncResult знаходиться в просторі імен System і тому є частиною інтерфейсу API NET

Викликаючи метод BeginReadO, ми говоримо: Заповни масив байтів найбільшим можливим числом байтів Зчитавши байти, виклич код споживача, який попрілості у вигляді лямбда-вирази . Заповнення масиву і виклик коду споживача відбувається в окремому потоці

Метод AsyncWaitHandlewaitone () викликається з метою ілюстрації, щоб іолненіе головного викликає потоку тривало тільки після того, як даие були лічені і оброблені Це зайвий виклик методу, т к він змушує операцію читання файлу виглядати подібно синхронної операції

Прочитана інформація обробляється наступним кодом: FileStream localFS = (FileStream) lambdaAsyncAsyncState int bytesRead = localFSEndRead (lambdaAsync)

string buffer = SystemTextASCIIEncodingASCIIGetString(data)

ConsoleWriteLine^&quotBuffer bytes read (&quot + bytesRead + &quot)&quot) localFSCloseO

Код споживача виконується в окремому потоці і є відповідальним за зчитування всіх байтів Код перетворює член даних Asyncstate  вFilestrea m і зчитує байти, що залишилися з потоку Після цього потік байтів преобразовиваея в рядок Коли всі дані лічені, файловий потік закривається

При використанні асинхронного підходу ми насправді створюємо код птавщіка / споживача Використання інтерфейсу iAsyncResult і методів BeginReadO і EndReadO є досить поширеним при цьому підході Метою асинхронного інтерфейсу є перетворення синхронної операції в асинхронну

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*