Новый подход Microsoft с параллельным кодом


Microsoft представила новый набор функций для .NET — языки C # и VB были изменены, чтобы упростить параллельное асинхронное программирование и, в частности, работу с потоком пользовательского интерфейса, но способ его работы может быть тонким, и вам нужно понимать это, чтобы увидеть, что вы получаете.

Новые возможности асинхронных методов являются мощными и обещают предоставить решение давней проблемы вывода работы из потока пользовательского интерфейса без усложнения структуры вашей программы.
Основную работу выполняют два новых ключевых слова. Модификатор async используется для создания асинхронных методов в отличие от стандартных синхронных методов. Асинхронный метод может быть приостановлен в своем исполнении появлением инструкции ожидания. В приостановленном состоянии метод не тратит ресурсы потока и действительно освобождает поток, в котором он был запущен, для выполнения полезной работы.
Например:
async void MyMethod (int i) {}
— это асинхронный метод, который может быть приостановлен как часть его обычного выполнения командой await.
Асинхронные методы могут возвращать только типы void, Task или Task . Самый простой случай — это когда асинхронный метод возвращает void, потому что нам не нужно беспокоиться о получении результата, когда он, наконец, будет завершен.
Чтобы приостановить синхронный метод во время выполнения другого задания, вы используете ключевое слово await.
Основной синтаксис:
жду
где t — это метод или «задача» с определенными стандартными методами, которые позволяют использовать его в шаблоне ожидания — GetAwaiter, BegnAwait и EndAwait.
Это очень похоже на шаблон асинхронного вызова, реализованный с использованием BeginInvoke, EndInvoke, но теперь со встроенными языковыми средствами.
То есть эти методы автоматически используются командой await для приостановки текущей асинхронной задачи, запуска t и обработки возвращаемых данных и продолжения исходной асинхронной задачи после завершения t. Конечно, t обычно запускается в собственном потоке.
Например, предположим, что MyAwaitableMethod () удовлетворяет требованиям шаблона ожидания, тогда вы можете написать:
async void MyMethod (int i) {делать что-либо ждать MyObject.MyAwaitableMethod (); делать больше}
В этом случае вызов MyMethod приведет к тому, что он будет делать что-то с использованием вызывающего потока, а затем ждать, то есть входить в состояние ожидания, пока MyAwaitableMethod не завершится, когда он затем выполнит больше действий, используя исходный поток.
На этом этапе вы можете быть озадачены тем, что эта конструкция дает вам нового, поскольку вызов MyAwaitableMethod выглядит как вызов стандартного метода блокировки. Это не так. Это связано с тем, что вызывающий поток освобождается с помощью await с результатом, который выглядит так, как будто MyMethod выполнил возврат. Ключевыми моментами являются то, что MyAwaitableMethod должен быть реализован для выполнения своей работы в другом потоке, а выполнение MyMethod продолжается только после его завершения и в исходном потоке.
Обратите внимание, что MyAwaitableMethod не запускается автоматически в новом потоке, простое использование await или async автоматически ничего не делает с потоками — вам нужно выполнить реализацию вручную. Однако для пользователя неблокирующего MyAwaitableMethod все намного проще. Существует множество стандартных неблокирующих методов, которые можно вызывать с помощью await, поэтому их гораздо проще использовать.

Конечно, это идеальный подход к тому, чтобы не блокировать поток пользовательского интерфейса — стандартная проблема как в формах Windows, так и в WPF. Представьте, что MyMethod был вызван в результате нажатия кнопки. Как только мы достигаем ожидания, поток пользовательского интерфейса возвращается и продолжает обрабатывать взаимодействия с пользователем только для того, чтобы вернуться в MyMethod после завершения MyAwaitableMethod.
Это мощный подход, способный упростить ваш код — и особенно решить давнюю проблему смещения работы из потока пользовательского интерфейса.
Все становится немного сложнее, когда задача должна возвращать результат, а асинхронный метод может иметь более одной инструкции ожидания, поэтому захват и освобождение исходного потока несколько раз. Как только вы поймете, как все это работает, все станет удивительно просто.
См. Наше руководство по новым функциям Async.
Если вы хотите получать информацию о новых статьях на I Programmer, вы можете подписаться на нас в Twitter, Facebook, Digg или подписаться на нашу еженедельную рассылку.
Вы можете загрузить CTP новых асинхронных функций с сайта загрузки Microsoft.


Добавить комментарий