<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1699308797722855785</id><updated>2024-10-24T15:26:28.112+03:00</updated><category term=".NET"/><category term="Visual Studio"/><category term="C#"/><category term="Интернет"/><category term="Книги"/><category term="Статьи"/><category term="Other"/><category term="Visual Studio Addins"/><category term="Office"/><category term="Sandcastle"/><category term="WPF"/><category term="WPF/E"/><category term="XML"/><category term="Алгоритмы"/><category term="64-бит"/><category term="ASP.NET MVC"/><category term="Async"/><category term="Blog Tools"/><category term="C# 5.0"/><category term="Google"/><category term="JSON"/><category term="LINQ"/><category term="Mono"/><category term="PDF"/><category term="Power Toys"/><category term="PowerThreading"/><category term="SOSEX"/><category term="TFS"/><category term="Web tools"/><category term="WinDbg"/><category term="XAML"/><category term="patterns and practices"/><category term="Афоризмы"/><category term="Цитаты"/><title type='text'>Sentinel&#39;s bLog</title><subtitle type='html'>Приобретать познания еще недостаточно для человека, надо уметь отдавать их в рост © Гёте</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default?start-index=26&amp;max-results=25'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-384459183928199365</id><published>2011-11-29T19:44:00.001+04:00</published><updated>2011-11-29T19:49:40.317+04:00</updated><title type='text'>Я.Субботник в Санкт-Петербурге, 3 декабря</title><content type='html'>Я.Субботник в Санкт-Петербурге пройдет 3 декабря в &lt;a href=&quot;http://company.yandex.ru/contacts/spb/&quot;&gt;офисе Яндекса&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://company.yandex.ru/public/subbotnik/reg.xml&quot;&gt;Регистрация&lt;/a&gt; на мероприятие начнется 23 ноября. Количество мест ограничено.&lt;br /&gt;
&lt;br /&gt;
Для тех, кто не попадёт в число участников или не сможет лично присутствовать на Я.Субботнике, будет организована &lt;a href=&quot;http://company.yandex.ru/public/subbotnik/online.xml&quot;&gt;онлайн-трансляция&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Подробную информацию о мероприятии читайте &lt;a href=&quot;http://company.yandex.ru/public/subbotnik/&quot;&gt;здесь&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/384459183928199365/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/384459183928199365' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/384459183928199365'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/384459183928199365'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2011/11/blog-post.html' title='Я.Субботник в Санкт-Петербурге, 3 декабря'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-7000874763666241321</id><published>2010-10-31T16:47:00.001+03:00</published><updated>2010-10-31T16:47:56.297+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Async"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="C# 5.0"/><title type='text'>Асинхронное программирование и C# 5.0</title><content type='html'>&lt;p&gt;На &lt;a href=&quot;http://player.microsoftpdc.com/session&quot; target=&quot;_blank&quot;&gt;PDC 2010&lt;/a&gt; были анонсированы асинхронные функции в C# и VB.NET. Рассказ о них хочется начать &lt;a href=&quot;http://blogs.msdn.com/b/ericlippert/archive/2010/10/28/asynchrony-in-c-5-part-one.aspx&quot; target=&quot;_blank&quot;&gt;историей эволюции C# Эрика Липперта&lt;/a&gt;:&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Проектировщики С# 2.0 осознали мучительность процесса написания логики работы итератора. Так были введены &lt;em&gt;блоки итераторов&lt;/em&gt;&lt;strong&gt; (&lt;/strong&gt;&lt;a title=&quot;Iterator block implementation details: auto-generated state machines&quot; href=&quot;http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;iterator blocks&lt;/em&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;. Это был способ дать понять компилятору как построить конечный автомат для хранения &lt;em&gt;продолжения &lt;/em&gt;(&lt;em&gt;&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5&quot; target=&quot;_blank&quot;&gt;continuation&lt;/a&gt;&lt;/em&gt;) - “&lt;em&gt;что будет дальше&lt;/em&gt;” – в состоянии где-то внутри, скрытом за кулисами, так чтобы больше не приходилось описывать это в коде.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Заодно они поняли трудность написания небольших методов, использующих локальные переменные и добавили &lt;em&gt;анонимные методы &lt;/em&gt;(&lt;a title=&quot;Anonymous Methods (C# Programming Guide)&quot; href=&quot;http://msdn.microsoft.com/en-us/library/0yw3tz5k(v=VS.100).aspx&quot; target=&quot;_blank&quot;&gt;anonymous methods&lt;/a&gt;&lt;em&gt;&lt;/em&gt;), чтобы дать возможность компилятору понять как обернуть локальные переменные в замыкающий класс и избавить вас от написания этого кода.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Проектировщики С# 3.0 поняли сложность написания кода, выполняющего сортировку, фильтрацию, объединение, группирование или обобщение сложных данных, поэтому и были добавлены &lt;a href=&quot;http://blogs.msdn.com/b/ruericlippert/archive/2009/12/07/10007637.aspx&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;выражения запроса&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (query comprehensions)&lt;/em&gt; и все остальные возможности LINQ. Тем самым компилятор научился делать правильные вызовы объектной модели для построения запроса, &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/bb397951.aspx&quot; target=&quot;_blank&quot;&gt;деревьев выражений&lt;/a&gt; и всего остального.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Проектировщики С# 4.0 поняли трудность взаимодействия как с современной, так и со старой динамической объектной моделью, поэтому и был добавлен тип &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd264741.aspx&quot; target=&quot;_blank&quot;&gt;dynamic&lt;/a&gt;. Так компилятор научился генерировать во время компиляции код, который будет обрабатываться в &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd233052.aspx&quot; target=&quot;_blank&quot;&gt;Dynamic Language Runtime&lt;/a&gt;во время выполнения.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Проектировщики C# 5.0 поняли сложность написания асинхронного кода: его трудно понять, преобразование в &lt;em&gt;continuation&lt;/em&gt; сложно и насыщает код вспомогательными механизмами, делающими неясным его назначение. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Так больше не могло продолжаться.&lt;/strong&gt;&lt;/p&gt; &lt;hr&gt;  &lt;h5&gt;Итак, что же мы получили и зачем?&lt;/h5&gt; &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://www.msdn.com/vstudio/async&quot; target=&quot;_blank&quot;&gt;Microsoft Visual Studio Async CTP&lt;/a&gt; представила новые языковые возможности для C# и VB и новые паттерны, позволяющие выполнять асинхронное программирование подобно и почти так же прямолинейно, как и синхронное. &lt;/p&gt; &lt;blockquote&gt; &lt;p align=&quot;justify&quot;&gt;Здесь и дальше под &lt;em&gt;асинхронным программированием&lt;/em&gt; (&lt;em&gt;asynchronous programming&lt;/em&gt;) я буду понимать асинхронную концепцию (стиль) программирования, основанную на том, что результат выполнения функции (операции), может быть доступен не сразу же (как в случае &lt;em&gt;синхронной &lt;/em&gt;операции), а через некоторое время, например, в виде некоторого &lt;em&gt;асинхронного&lt;/em&gt; (&lt;em&gt;нарушающего обычный порядок выполнения&lt;/em&gt;) вызова.&lt;/p&gt;&lt;/blockquote&gt; &lt;p align=&quot;justify&quot;&gt;Долгое время программирование работы с удаленными ресурсами было достаточно проблематичным. Несмотря на неуклонный рост уровня абстракций для “локального” программирования, оставалась необходимость сделать операции с удаленными ресурсами более прозрачными, похожими на локальные, так чтобы разработчику не приходилось бороться с концептуальной избыточностью или, например, архитектурному “сопротивлению” несоответствиям между этими моделями.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Проблема заключается в том, что удаленные операции &lt;em&gt;отличаются&lt;/em&gt; от локальных. Они различаются на порядки по задержкам доступа даже в лучшем случае, могут сбоить как-то по новому или просто никогда не вернуться, зависят от множества внешних факторов за пределами контроля или просто понимания разработчика.&amp;nbsp; И хотя они &lt;em&gt;могут&lt;/em&gt; быть представлены как “&lt;em&gt;просто вызовы методов&lt;/em&gt;”, это нежелательно, так как оставляет разработчика без возможности обработки особенных состояний, возникающих в силу их удаленности – отмена выполнения и обработка тайм-аутов, сохранение состояния потока во время блокирующего вызова, прогнозирование и обработка возможных проблем с сохранением восприимчивости к внешним действиям и т.п.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;На текущий момент в .NET имелось несколько шаблонов, применяемых при асинхронном программировании, например, для работы с вводом/выводом и другими подобными операциями с большим временем доступы без блокирования потока. В большинстве случаев .NET предоставляет как синхронный (т.е. прозрачно блокирующий поток) и асинхронный (т.е. с явной задержкой выполнения) способы выполнения операций. Проблема заключается в том, что текущие шаблоны серьезно нарушают программную структуру, приводя к весьма сложному и подверженному ошибкам коду или (что гораздо чаще) разработчики сдаются и используют блокирующий подход, получая проблемы с сохранением восприимчивости к внешним событиям и производительностью взамен.&lt;/p&gt; &lt;blockquote&gt; &lt;p align=&quot;justify&quot;&gt;Основная цель нововведения дать асинхронной концепции программирования максимально близкую к синхронной парадигме, тем не менее с сохранением возможности обрабатывать ситуации специфичные для асинхронной обработки. Асинхронность должна быть явной и непрозрачной, но в тоже время легковесной и не нарушающей привычный порядок, все должно работать так же просто и интуитивно понятно как это происходит в случае синхронного кода. &lt;/p&gt;&lt;/blockquote&gt; &lt;p align=&quot;justify&quot;&gt;&lt;/p&gt; &lt;hr&gt;  &lt;h5 align=&quot;justify&quot;&gt;Нововведения в C#&lt;/h5&gt; &lt;p align=&quot;justify&quot;&gt;С выходом Async CTP мы получили Community Technology Preview прототипа компилятора C# 5.0. Это именно прототип, предварительная версия для знакомства с новыми возможностями и в будущем &lt;strong&gt;все может измениться, даже синтаксис&lt;/strong&gt;.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;C# 5.0 вводит два новых ключевых слова &lt;strong&gt;&lt;em&gt;&lt;font style=&quot;background-color: #ffffff&quot; color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt; &lt;/strong&gt;и &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;async&lt;/font&gt; &lt;/strong&gt;&lt;/em&gt;для реализации &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=204845&quot; target=&quot;_blank&quot;&gt;асинхронных функций в C#&lt;/a&gt;. В двух словах, модификатор &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;async&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; помечает метод или лямбда-выражение как &lt;em&gt;асинхронные&lt;/em&gt;. Оператор &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt; прекращает работу до тех пор, пока не будет завершена ожидаемая задача.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Другими словами, синхронный код:&lt;/p&gt; &lt;blockquote&gt; &lt;p align=&quot;justify&quot;&gt;&lt;em&gt;загрузить&lt;/em&gt; данные, &lt;em&gt;подождать&lt;/em&gt; результата, &lt;em&gt;обработать&lt;/em&gt;,&lt;em&gt; подождать&lt;/em&gt; окончания,&lt;em&gt; сохранить&lt;/em&gt; результат, &lt;em&gt;подождать…&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p align=&quot;justify&quot;&gt;преобразуется в асинхронный:&lt;/p&gt; &lt;blockquote&gt; &lt;p align=&quot;justify&quot;&gt;&lt;em&gt;начать&lt;/em&gt; загрузку данных, &lt;em&gt;когда будет закончено, начать&lt;/em&gt; обработку данных, &lt;em&gt;когда будет закончено,&lt;/em&gt; &lt;em&gt;начать &lt;/em&gt;сохранение результатов, &lt;em&gt;когда результаты будут&lt;/em&gt; сохранены…&lt;/p&gt;&lt;/blockquote&gt; &lt;p align=&quot;justify&quot;&gt;То есть, за счет введения двух новых ключевых слов типичный &lt;em&gt;императивный&lt;/em&gt; код (сделай это, потом сделай то) преобразуется в &lt;em&gt;декларативный&lt;/em&gt; (делай это, когда закончишь делай то). За декларативным асинхронным программированием стоит явное намерение эффективного использования доступных ресурсов. Anders Hejlsberg пообещал что &lt;strong&gt;&lt;em&gt;wait+async&lt;/em&gt; &lt;/strong&gt;это первые шаги для поддержки параллельного программирования на уровне языка.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Асинхронные операции – это методы и другие функции, которые большую часть выполнения (обработки) могут произвести &lt;em&gt;после &lt;/em&gt;своего возврата. &lt;/p&gt; &lt;p&gt;&lt;em&gt;Рекомендуемый&lt;/em&gt; паттерн в .NET для реализации асинхронных функций, возвращать &lt;em&gt;задачу&lt;/em&gt;, представляющую выполняемую операцию и позволяющую ожидать ее окончания в какой-то момент времени. &lt;em&gt;Асинхронные функции – &lt;/em&gt;это новая возможность в C#, предоставляющая упрощенные средства для выражения асинхронных операций.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Небольшой пример:&lt;/p&gt; &lt;div id=&quot;codeSnippetWrapper&quot;&gt; &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;Task&amp;lt;Movie&amp;gt; GetMovieAsync(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; title);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;Task PlayMovieAsync(Movie movie);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;async &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; GetAndPlayMoviesAsync(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;[] titles)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;foreach&lt;/span&gt; (var title &lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt; titles)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        var movie = await GetMovieAsync(title);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        await PlayMovieAsync(movie);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p align=&quot;justify&quot;&gt;По соглашению, асинхронные операции используют суффикс “&lt;em&gt;Async&lt;/em&gt;”, чтобы показать, что частично их выполнение может быть произведено после возврата из метода. И &lt;em&gt;GetMovieAsync,&lt;/em&gt; и &lt;em&gt;PlayMovieAsync&lt;/em&gt; возвращают задачу, что обозначает, что их окончание в последствии можно &lt;em&gt;ожидать&lt;/em&gt;. В противоположность этому &lt;em&gt;GetAndPlayMoviesAsync &lt;/em&gt;возвращает &lt;em&gt;void,&lt;/em&gt; так что ожидание его окончания (через &lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;)&amp;nbsp; невозможно. Подобные асинхронные операции часто называют как “&lt;em&gt;запустил и забыл&lt;/em&gt;” и могут быть полезны например для реализации асинхронных обработчиков событий.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;em&gt;GetAndPlayMoviesAsync &lt;/em&gt;помечен модификатором &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;async&lt;/font&gt; &lt;/strong&gt;&lt;/em&gt;как асинхронная функция, содержащая два &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;-выражения&lt;/em&gt;. Этот факт сообщает вызывающему о деталях реализации метода и фундаментально изменяет способ, которым метод выполняется: как только незавершенная задача (&lt;em&gt;Task&lt;/em&gt;) начнет ожидание, управление будет возвращено вызывающему. Когда ожидаемая задача (&lt;em&gt;Task&lt;/em&gt;) завершится, выполнение метода &lt;em&gt;GetAndPlayMoviesAsync &lt;/em&gt;возобновится, до ожидания следующей незавершенной задачи и т.д. В промежутках между ожиданиями незавершенных задач, не занимается никакой дополнительный поток на выполнение этого метода, время “занимается” только в моменты активности.&lt;/p&gt;
&lt;p&gt;Прежде чем двигаться дальше хочу прояснить частое заблуждение, связанное с понятием асинхронности.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;Асинхронность не является синонимом “&lt;em&gt;параллелизма&lt;/em&gt;” (&lt;em&gt;concurrency&lt;/em&gt;) (одновременного (параллельного) выполнение компьютером нескольких операций), она может быть реализована с использованием этого подхода, но это не является обязательным. Другой пример реализации асинхронности – это разбиение начальной задачи на небольшие части, объединение их в очередь и затем выполнение обработки, когда поток не занят чем-то другим.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Итак, новые ключевые слова: &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt; - &lt;/em&gt;указывает, что вызывающий хочет получить управление, когда вызов асинхронного метода будет завершен, &lt;font color=&quot;#0000ff&quot;&gt;async&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; – это модификатор для метода или анонимной функции, показывающий, что они являются &lt;em&gt;&lt;strong&gt;асинхронными&lt;/strong&gt;&lt;/em&gt;. Функции без этого модификатора считаются &lt;strong&gt;&lt;em&gt;синхронными&lt;/em&gt;&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx&quot; target=&quot;_blank&quot;&gt;Несколько замечаний&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Модификатор метода &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;async&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;не&lt;/em&gt;&lt;/strong&gt; означает, что “&lt;em&gt;данный метод будет автоматически запланирован к запуску в рабочем потоке асинхронно&lt;/em&gt;”. Он обозначает &lt;em&gt;&lt;strong&gt;прямо противоположное&lt;/strong&gt;, &lt;/em&gt;“&lt;em&gt;этот метод содержит управляющую логику, связанную с ожиданием асинхронных операций и тем самым будет перезаписан компилятором в стиле передачи продолжений (&lt;a href=&quot;http://blogs.msdn.com/b/ericlippert/archive/tags/continuation+passing+style/&quot; target=&quot;_blank&quot;&gt;continuation passing style&lt;/a&gt;) для гарантии того, что асинхронные операции смогут продолжить выполнение этого места с корректной точки&lt;/em&gt;”. &lt;strong&gt;Главная особенность асинхронных методов состоит как раз в том, чтобы оставаться в текущем потоке как можно дольше. &lt;/strong&gt;Они подобны сопрограммам (&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0&quot; target=&quot;_blank&quot;&gt;coroutines&lt;/a&gt;): асинхронные методы добавляют однопоточную кооперативную многозадачность в C#. &lt;br&gt;&lt;/font&gt;&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Оператор &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; не обозначает “&lt;em&gt;эта операция блокирует текущий поток до возврата из асинхронной операции&lt;/em&gt;”. Это превратило бы асинхронные операции в синхронные, чего собственно и хотелось избежать. Смысл же противоположный: “&lt;em&gt;если задача, которую мы ожидаем еще не завершена, то запишем остальную часть метода как продолжение этой задачи и сразу вернемся к вызывающему; задача продолжится (будет вызвано продолжение) по завершению асинхронной операции&lt;/em&gt;”. &lt;br&gt;&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Во время выполнения асинхронная функция может быть в одном из трех состояний: &lt;em&gt;&lt;strong&gt;выполняется&lt;/strong&gt;&lt;/em&gt;, &lt;strong&gt;&lt;em&gt;приостановлена&lt;/em&gt;&lt;/strong&gt; на &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; или &lt;strong&gt;&lt;em&gt;выполнена&lt;/em&gt;&lt;/strong&gt;.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;

&lt;h5&gt;“Путанница”&lt;/h5&gt;
&lt;p align=&quot;justify&quot;&gt;Исходный документ (&lt;em&gt;(CSharp Spec) Asynchronous Functions&lt;/em&gt;) меня несколько ввел в заблуждение, возникло впечатление, что новый функционал&amp;nbsp; полностью завязан на &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd235678.aspx&quot; target=&quot;_blank&quot;&gt;Task&lt;/a&gt;. Однако, благодаря &lt;a href=&quot;http://reedcopsey.com/2010/10/28/c-5-async-part-1-simplifying-asynchrony-that-for-which-we-await/&quot; target=&quot;_blank&quot;&gt;Reed Copsey, Jr.&lt;/a&gt;, &lt;a href=&quot;http://msmvps.com/blogs/jon_skeet/archive/2010/10/29/initial-thoughts-on-c-5-s-async-support.aspx&quot; target=&quot;_blank&quot;&gt;Jon Skeet&lt;/a&gt; и собственным экспериментам, удалось понять, что это не так.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Нововведения разделю на две части: изменения &lt;em&gt;в языке&lt;/em&gt; и изменения &lt;em&gt;в Framework&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;

&lt;h5&gt;Изменения в языке&lt;/h5&gt;
&lt;p align=&quot;justify&quot;&gt;Грамматика C# была расширена &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;-выражениями&lt;/em&gt;&lt;/strong&gt;, используемыми для приостановки выполнения асинхронной функции, пока ожидаемая задача не будет выполнена. &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;-выражения допускаются только в теле &lt;em&gt;асинхронных функций&lt;/em&gt;. Внутри асинхронной функции выражение &lt;em&gt;&lt;strong&gt;не может&lt;/strong&gt;&lt;/em&gt; использоваться в теле &lt;em&gt;синхронной&lt;/em&gt; функции, в &lt;em&gt;catch &lt;/em&gt;или &lt;em&gt;finally &lt;/em&gt;блока оператора&lt;em&gt; try&lt;/em&gt;, внутри &lt;em&gt;lock&lt;/em&gt; или в небезопасном (&lt;em&gt;unsafe&lt;/em&gt;) контексте. Однако, внутри самого &lt;em&gt;try &lt;/em&gt;и, как следствие, в &lt;em&gt;using&lt;/em&gt; вполне допустимы.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;&lt;em&gt;Шаблон&lt;/em&gt; &lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Выражение &lt;em&gt;t&lt;/em&gt; &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;-выражения “&lt;em&gt;await t” &lt;/em&gt;называется задачей (&lt;em&gt;это просто термин, не относящийся к типу Task&lt;/em&gt;) выражения. Задача &lt;em&gt;t&lt;/em&gt; должна позволять ожидание (быть &lt;em&gt;awaitable)&lt;/em&gt;, что означает выполнение следующих условий:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;&lt;em&gt;(t).GetAwaiter()&lt;/em&gt; должно быть верным выражением типа &lt;i&gt;A&lt;/i&gt;.&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Для данного выражения &lt;em&gt;a&lt;/em&gt; типа &lt;em&gt;A&lt;/em&gt; и выражения &lt;em&gt;r&lt;/em&gt; типа &lt;em&gt;System.Action &lt;/em&gt;выражение &lt;em&gt;(a).BeginAwait(r)&lt;/em&gt; должно быть верным &lt;em&gt;логическим выражением.&lt;/em&gt;&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Для заданного выражения &lt;i&gt;a&lt;/i&gt; типа &lt;i&gt;A&lt;/i&gt;, &lt;em&gt;(a).EndAwait()&lt;/em&gt; должно быть верным выражением.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;em&gt;A&lt;/em&gt; называется ожидающим (&lt;em&gt;awaiter) &lt;/em&gt;типом&lt;em&gt; &lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;-выражения. &lt;/em&gt;Метод &lt;em&gt;GetAwaiter&lt;/em&gt; используется для получения &lt;em&gt;awaiter&lt;/em&gt;-типа для задачи.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Метод &lt;em&gt;BeginAwait&lt;/em&gt; используется для записи &lt;em&gt;продолжения&lt;/em&gt; ожидающей задачи. &lt;em&gt;Продолжение &lt;/em&gt;передаваемое в качестве параметра является &lt;em&gt;делегатом возобновления.&lt;/em&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Метод &lt;em&gt;EndAwait&lt;/em&gt; используется для получения результата выполнения задачи, после ее завершения.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;Вызовы методов разрешаются &lt;em&gt;синтаксически&lt;/em&gt;, то есть &lt;em&gt;GetAwaiter&lt;/em&gt;, &lt;em&gt;BeginAwait&lt;/em&gt; и &lt;em&gt;EndAwait &lt;/em&gt;могут быть как &lt;em&gt;членами экземпляра&lt;/em&gt;, так и методами расширениями (&lt;em&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb383977.aspx&quot; target=&quot;_blank&quot;&gt;extension&lt;/a&gt;&lt;/em&gt;) или даже привязанными динамически, главное чтобы вызов был верным в контексте &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;-&lt;em&gt;выражения&lt;/em&gt;. &lt;em&gt;Подразумевается&lt;/em&gt;, что все они должны быть “&lt;em&gt;неблокирующими&lt;/em&gt;”&lt;em&gt;, &lt;/em&gt;то есть не приводят к значительному ожиданию вызывающего потока, например окончания завершения операции.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;-&lt;em&gt;выражение&lt;/em&gt; классифицируется так же как и выражение &lt;em&gt;(a).EndAwait()&lt;/em&gt;, то есть:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;если выражение &lt;em&gt;(a).EndAwait() &lt;/em&gt;вызывает метод или делгат, возвращающий тип &lt;em&gt;void&lt;/em&gt;, то результатом и будет &lt;em&gt;void&lt;/em&gt;.&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;в противном случае результат будет того типа, который возвращает &lt;em&gt;(a).EndAwait().&lt;/em&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;em&gt;&lt;strong&gt;Вычисление &lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;-выражений&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Во время выполнения тела асинхронной функции &lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt; t&lt;/em&gt; вычисляется следующим образом:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;&lt;em&gt;awaiter a&lt;/em&gt; получается путем вычисления выражения &lt;em&gt;(t).GetAwaiter()&lt;/em&gt;&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;вычисляется логическое выражение &lt;em&gt;(a).BeginAwait(r)&lt;/em&gt;, где &lt;em&gt;r&lt;/em&gt; – делегат, первое выполнение которого приведет к тому, что заключенная в выражении асинхронная функция будет продолжена с текущего &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;-&lt;/strong&gt;выражения.&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;если результатом логического выражения является &lt;em&gt;true&lt;/em&gt; вычисление приостанавливается и управление возвращается методу, который вызвал или возобновил выполнение асинхронной функции.&lt;/div&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;затем (или сразу, или во время возобновления) вычисляется выражение &lt;em&gt;(a).EndAwait()&lt;/em&gt;. Если оно возвращает какое-то значение, то это значение и становится &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;-выражения.&lt;/em&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p align=&quot;justify&quot;&gt;Метод &lt;em&gt;BeginAwait&lt;/em&gt; либо возвращает &lt;em&gt;false,&lt;/em&gt; чтобы показать, что задача уже &lt;em&gt;завершена&lt;/em&gt;, либо &lt;em&gt;true,&lt;/em&gt; чтобы показать, что делегат &lt;em&gt;r&lt;/em&gt; необходимо вызвать, когда задача в конце концов завершится. Возврат &lt;em&gt;false &lt;/em&gt;позволяет выполнять ожидание (&lt;em&gt;await)&lt;/em&gt;&amp;nbsp;&lt;em&gt;уже завершенных&lt;/em&gt; задач, предотвращая приостановку выполнения только для того, чтобы сразу оно было возобновлено.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Если &lt;em&gt;BeginAwait &lt;/em&gt;возвращает &lt;em&gt;true&lt;/em&gt;, то &lt;em&gt;&lt;strong&gt;awaiter&lt;/strong&gt;&lt;/em&gt; должен позаботиться о том, чтобы делегат &lt;em&gt;r&lt;/em&gt; был вызван не больше раза.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Если &lt;em&gt;BeginAwait &lt;/em&gt;возвращает&lt;em&gt; false&lt;/em&gt;, то &lt;em&gt;&lt;strong&gt;awaiter&lt;/strong&gt;&lt;/em&gt; должен удостовериться, что делегат &lt;em&gt;r&lt;/em&gt; &lt;em&gt;не будет вызван ни разу&lt;/em&gt;. Если &lt;em&gt;r &lt;/em&gt;не смотря на ограничения будет вызван, то поведение &lt;em&gt;не определено&lt;/em&gt;.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Другими словами, если &lt;em&gt;BeginAwait&lt;/em&gt; возращает &lt;em&gt;true,&lt;/em&gt; то так или иначе должно быть вызвано &lt;em&gt;продолжение,&lt;/em&gt; если нет, то это значит, что задача уже завершена и механизма продолжения не требуется. &lt;em&gt;EndAwait&lt;/em&gt; просто выделяет, что считать результатом выполнения задачи.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;На практике это означает, что на уровне &lt;em&gt;компилятора&lt;/em&gt; &lt;strong&gt;нет никакой привязки к задачам (&lt;em&gt;Task&lt;/em&gt;)&lt;/strong&gt;, все что надо, это реализация в классе или в расширениях трех методов: &lt;em&gt;GetAwaiter&lt;/em&gt;, &lt;em&gt;BeginAwait&lt;/em&gt; и &lt;em&gt;EndAwait&lt;/em&gt;, и этого будет вполне достаточно для того, чтобы воспользоваться новым механизмом. Подробнее о разрешении методов можно почитать в статье Jon Skeet: &lt;a href=&quot;http://msmvps.com/blogs/jon_skeet/archive/2010/10/31/c-5-async-experimenting-with-member-resolution-getawaiter-beginawait-endawait.aspx&quot;&gt;C# 5 async: experimenting with member resolution (GetAwaiter, BeginAwait, EndAwait)&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;По существу, новые методы реализуют вполне привычную программную модель работы с асинхронными методами (&lt;span style=&quot;widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium &#39;Times New Roman&#39;; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px&quot; class=&quot;Apple-style-span&quot;&gt;&lt;span style=&quot;text-align: left; line-height: 18px; border-collapse: collapse; font-family: &#39;Segoe UI&#39;, verdana, arial; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px&quot; class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms228969.aspx&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;Asynchronous Programming Model&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;) с разделением задачи на Begin/End методы и методом обратного вызова для сигнализации окончания выполнения. Основное отличие в том, что теперь генерация подобных “оберток” делается &lt;em&gt;компилятором автоматически&lt;/em&gt;. &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;span style=&quot;widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium &#39;Times New Roman&#39;; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px&quot; class=&quot;Apple-style-span&quot;&gt;&lt;span style=&quot;text-align: left; line-height: 18px; border-collapse: collapse; font-family: &#39;Segoe UI&#39;, verdana, arial; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px&quot; class=&quot;Apple-style-span&quot;&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;В подавляющем большинстве случаев, для практического применения “ручного” задания класса, с соответствующим интерфейсом не потребуется, так как для большинства задач, в которых применение нового асинхронного шаблона имеет смысл (например, задачи ввода/вывода, сложные расчетные задачи), удобно реализовывать с помощью нового для .NET 4 &lt;em&gt;Task&lt;/em&gt; из Task Parallel Library, а &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;-выражения &lt;/em&gt;&lt;/strong&gt;с &lt;em&gt;Task&lt;/em&gt; поддерживаются непосредственно, без необходимости писать дополнительный код. Так же в Framework добавлено множество расширений стандартных классов возвращающих &lt;em&gt;Task&amp;lt;TResult&amp;gt;&lt;/em&gt; в качестве результата, что позволяет так же использовать эти методы непосредственно в &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;. &lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;Все же знать принципы работы, думаю весьма полезно. Для примера следующий класс, вполне удовлетворяет правилам:&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Awaiter&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; Awaiter GetAwaiter()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;this&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;bool&lt;/span&gt; BeginAwait(Action continuation)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; EndAwait()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;В конце статьи я приведу немного более подробный пример консольного приложения, который продемонстрирует это на практике.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;На всякий случай замечу, никто не заставляет повторять вручную и писать собственные реализации с &lt;em&gt;Task&lt;/em&gt; для работы с асинхронными функциями вместо тех, что предоставляет Framework. Но понимать, происходящие внутри процессы весьма важно. Именно, поэтому я на них специально остановился. За более подробными примерами можно обратиться к статье &lt;a href=&quot;http://msmvps.com/blogs/jon_skeet/archive/2010/10/30/c-5-async-investigating-control-flow.aspx&quot; target=&quot;_blank&quot;&gt;Jon Skeet: C# 5 async: investigating control flow&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;

&lt;h5&gt;Что делает компилятор?&lt;/h5&gt;
&lt;p&gt;На самом деле, компилятор выполняет обработку сильно напоминающую обработку для итераторов (&lt;em&gt;yield return&lt;/em&gt;).&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Асинхронный метод – это не обычный последовательный метод, он преобразуется в &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82&quot; target=&quot;_blank&quot;&gt;конечный автомат&lt;/a&gt; (объект) с некоторым набором состояний (локальные переменные становятся полями этого объекта), каждый блок кода между последовательными использованиями &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; является одним “шагом” автомата. &lt;/font&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Это обозначает, что когда метод запускается на выполнение, он просто делает первый шаг и затем конечный автомат возвращается, запланировав какие-то действия, когда эти действия будут выполнены, запустится следующий шаг автомата.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Для примера, следующий код:&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;async Task TestAsync() &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{ &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    var var1 = F(); &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    var var2 = await FAsync(); &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    more(var1, var2);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;Будет преобразован в нечто подобное:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; _TestAsync &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;  &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; _var1, _var2;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;  &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; _state = 0; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;  Task&amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt;&amp;gt; _await1;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;  &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; DoStep() &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;  {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;switch&lt;/span&gt;(_state)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;case&lt;/span&gt; 0: &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;          _var1 = F();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;          _await1 = FAsync();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;      &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;          _state = 1;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;p&gt;          SetContinuation(DoStep); &lt;span style=&quot;color: #008000&quot;&gt;// По завершению асинхронной операции необходимо вызвать этот же метод&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;          &lt;span style=&quot;color: #0000ff&quot;&gt;case&lt;/span&gt; 1:&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;blockquote&gt;&lt;p&gt;      &lt;span style=&quot;color: #008000&quot;&gt;// Получение результата операции&lt;/span&gt;&lt;/p&gt;&lt;p&gt;      _var2 = _await1.Result;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&amp;nbsp; more(_var1, _var2);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;  }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;Важным здесь является использование метода &lt;em&gt;SetContinuation()&lt;/em&gt;, для указания что когда операция будет завершена, необходимо вызвать еще раз метод &lt;em&gt;DoStep()&lt;/em&gt;, а за счет того, что состояние изменилось (переменная &lt;em&gt;_state&lt;/em&gt;), при повторном вызове будет выполнена вторая часть метода (&lt;em&gt;case 1&lt;/em&gt;). &lt;/div&gt;
&lt;p align=&quot;justify&quot;&gt;Данное преобразование очень близко к аналогичному для итераторов и на деле, одним из приемов для упрощения работы с асинхронными методами и является их использование. Для примера, можно вспомнить библиотеку &lt;a href=&quot;http://www.wintellect.com/Resources/Downloads&quot; target=&quot;_blank&quot;&gt;PowerThreading&lt;/a&gt; от Jeffrey Richter или статью &lt;a href=&quot;http://tomasp.net/blog/csharp-async.aspx&quot; target=&quot;_blank&quot;&gt;Asynchronous Programming in C# using Iterators&lt;/a&gt;, где рассматриваются схожие идеи.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;На самом деле, преобразование несколько сложнее так как помимо продолжения операции необходимо, например, учитывать возможные исключения в процессе работы.&amp;nbsp; Примеры преобразований приведены в конце новой спецификации (&lt;em&gt;(CSharp Spec) Asynchronous Functions (документация Async CTP)&lt;/em&gt;), посмотрите на раздел &lt;em&gt;Implementation example&lt;/em&gt;, колонку &lt;em&gt;Syntactic expansion&lt;/em&gt;. Кроме этого, можно просто скомпилировать какой-нибудь пример и глянуть результат &lt;a href=&quot;http://reflector.red-gate.com&quot; target=&quot;_blank&quot;&gt;Reflector&lt;/a&gt;’ом.&lt;/p&gt;
&lt;hr&gt;

&lt;h5&gt;Изменения в Framework&lt;/h5&gt;
&lt;p align=&quot;justify&quot;&gt;Для упрощения перехода на новую модель команда разработки Async CTP &lt;em&gt;расширила&lt;/em&gt; с использованием нового подхода класс &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd235678.aspx&quot; target=&quot;_blank&quot;&gt;Task&lt;/a&gt;, представив новый шаблон &lt;i&gt;Task-based Asynchronous Pattern&lt;/i&gt; (TAP) (&lt;em&gt;Асинхронный шаблон проектирования на основе задач&lt;/em&gt;),&lt;em&gt; &lt;/em&gt;подробности можно прочитать в документах &lt;strong&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=D7CCFEFA-123A-40E5-8ED5-8D2EDD68ACF4&quot; target=&quot;_blank&quot;&gt;Asynchrony in .NET&lt;/a&gt; и &lt;/strong&gt;The Task-based Asynchronous Pattern (находятся в каталоге документации после установки Async CTP)&lt;strong&gt;. &lt;/strong&gt;На данный момент они находятся в сборке &lt;strong&gt;&lt;em&gt;AsyncCtpLibrary.dll.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;Еще раз обращаю внимание: расширение класса &lt;em&gt;Task&lt;/em&gt; и асинхронные решения на его основе, являются дополнением Framework, а не компилятора и призваны упростить миграцию кода в соответствии с новым подходом. Для компилятора нет разницы используется ли класс &lt;em&gt;Task&lt;/em&gt; или другой класс, при условии следования описанным правилам. Но реальная реализация большинства новых методов, выполнена за счет расширения класса &lt;em&gt;Task&lt;/em&gt;&amp;nbsp; методом &lt;em&gt;GetAwaiter()&lt;/em&gt;, возвращающим структуру &lt;em&gt;TaskAwaiter&lt;/em&gt; и для дальнейшей работы используются уже её методы &lt;em&gt;BeginAwait&lt;/em&gt; и &lt;em&gt;EndAwait.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;a title=&quot;Finally: why &amp;quot;Task&amp;quot;?&quot; href=&quot;http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx&quot; target=&quot;_blank&quot;&gt;Почему за основу взят именно класс Task?&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Причина заключается в том, асинхронность не требует параллелизма, но параллелизм требует асинхронности и многие инструментальные средства полезные для параллелизма могут быть так же легко использованы для непараллельной асинхронности. В &lt;em&gt;Task &lt;/em&gt;нет неотъемлемого присутствия параллелизма, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd460717.aspx&quot; target=&quot;_blank&quot;&gt;Task Parallel Library&lt;/a&gt; (TPL) использует шаблон на основе задач для представления частей выполняющейся задачи, которые могут быть распараллелены, &lt;em&gt;не требуя&lt;/em&gt; многозадачности. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;Для кода, ожидающего результат на самом деле совершенно не важно, что результат будет вычислен во время простоя потока, в отдельном потоке текущего процесса, в другом процессе или где-то на другом конце мира. Все, что имеет значение – это то, что во время ожидания результата данный процессор может заняться чем-то еще, если мы ему это позволим.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;В класс &lt;em&gt;Task&lt;/em&gt; из TPL вложено очень многое: у него есть механизм отмены (&lt;em&gt;cancellation&lt;/em&gt;) и другие полезные возможности. Вместо изобретения чего-то нового наподобие “IFuture”, просто был расширен существующий код для удовлетворения асинхронным потребностям.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;AsyncCtpLibrary &lt;/strong&gt;включает в себя множество extension-методов для существующих в Framework классов, с тем, чтобы предоставить асинхронные варианты существующих методов. По соглашению, эти методы названы с суффиксом &lt;em&gt;Async&lt;/em&gt;, например &lt;em&gt;CopyToAsync &lt;/em&gt;для асинхронного копирования потока. В случае, если в классе был уже метод с суффиксом &lt;em&gt;Async, &lt;/em&gt;то для избежания путаницы&amp;nbsp; в таких классах методы имеют суффикс &lt;em&gt;TaskAsync, &lt;/em&gt;например, &lt;em&gt;DownloadDataTaskAsync. &lt;/em&gt;Все эти методы приведены в соответствие требованиям для возможности использования вместе с &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Сам класс &lt;em&gt;Task &lt;/em&gt;так же был расширен (структура &lt;em&gt;TaskAwaiter)&lt;/em&gt;, чтобы позволять своё использование с &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;. Кроме того, “пригодились” и изначально заложенные в TPL &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd997405.aspx&quot; target=&quot;_blank&quot;&gt;возможности по взаимодействию с существующей асинхронной моделью&lt;/a&gt;, семейство методов &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd321448.aspx&quot; target=&quot;_blank&quot;&gt;TaskFactory.FromAsync&lt;/a&gt;, использующихся для конструирования &lt;em&gt;Task&lt;/em&gt; из пары Begin/End методов “старой” модели асинхронного программирования (&lt;span style=&quot;widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium &#39;Times New Roman&#39;; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px&quot; class=&quot;Apple-style-span&quot;&gt;&lt;span style=&quot;text-align: left; line-height: 18px; border-collapse: collapse; font-family: &#39;Segoe UI&#39;, verdana, arial; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px&quot; class=&quot;Apple-style-span&quot;&gt;&lt;em&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms228969.aspx&quot; target=&quot;_blank&quot;&gt;Asynchronous Programming Model&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;).&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Помимо расширений для классов Framework для возможности использования с &lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;, добавились и дополнительные методы, например, &lt;em&gt;Yield,&lt;/em&gt; используется, чтобы временно прервать выполнение, позволяя продолжиться другим операциям, &lt;em&gt;SwitchTo &lt;/em&gt;используется для переключения контекста (&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.threading.synchronizationcontext.aspx&quot; target=&quot;_blank&quot;&gt;SynchronizationContext&lt;/a&gt;&lt;em&gt;&lt;/em&gt;) выполнения операции. Например,&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; async &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; button1_Click(&lt;span style=&quot;color: #0000ff&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; text = txtInput.Text;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    await ThreadPool.SwitchTo(); &lt;span style=&quot;color: #008000&quot;&gt;// переключение в ThreadPool&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; result = ComputeOutput(text);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; finalResult = ProcessOutput(result);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    await txtOutput.Dispatcher.SwitchTo(); &lt;span style=&quot;color: #008000&quot;&gt;// переключение в поток TextBox&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    txtOutput.Text = finalResult;    &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p align=&quot;justify&quot;&gt;Нововведений довольно много, в короткой заметке все не охватить за примерами, приемами работы и самое главное подробностями рекомендую обратиться к The Task-based Asynchronous Pattern от Stephen Toub, где они весьма неплохо рассмотрены.&lt;/p&gt;
&lt;hr&gt;

&lt;h5 align=&quot;justify&quot;&gt;Как это работает на уровне Task (&lt;span style=&quot;line-height: 115%; font-family: &#39;Calibri&#39;,&#39;sans-serif&#39;; font-size: 11pt; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot; lang=&quot;EN-US&quot;&gt;&lt;em&gt;Task-based Asynchronous Pattern&lt;/em&gt;&lt;/span&gt;)?&lt;/h5&gt;
&lt;p align=&quot;justify&quot;&gt;Async CTP помимо нововведений в язык, ориентирована на использование нового механизма непосредственно с TPL, поддерживая &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;-&lt;/em&gt;&lt;/strong&gt;выражения непосредственно над &lt;em&gt;Task&lt;/em&gt;.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;На уровне &lt;a href=&quot;http://ru.wikipedia.org/wiki/API&quot; target=&quot;_blank&quot;&gt;API&lt;/a&gt; неблокирующее ожидание достигается за счет предоставления методов обратного вызова (&lt;em&gt;&lt;a href=&quot;http://ru.wikipedia.org/wiki/Callback_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)&quot; target=&quot;_blank&quot;&gt;callbacks&lt;/a&gt;&lt;/em&gt;), вызываемых после завершения операции. Для задач (&lt;em&gt;Task&lt;/em&gt;) это же достигается для счет методов типа &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.threading.tasks.task.continuewith.aspx&quot; target=&quot;_blank&quot;&gt;ContinueWith&lt;/a&gt;. Поддержка асинхронного подхода в языке прячет обратные вызовы, позволяя асинхронным операциям ожидать окончания выполнения в обычном порядке за счет генерируемого компилятором кода. &lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Как я уже писал, &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; непосредственно поддерживает асинхронное ожидание &lt;em&gt;Task&lt;/em&gt; и &lt;em&gt;Task&amp;lt;TResult&amp;gt;. &lt;/em&gt;На данный&lt;em&gt; &lt;/em&gt;момент это достигается за счет соответствующих методов расширения &lt;em&gt;Task&lt;/em&gt; (см. структуру &lt;em&gt;TaskAwaiter),&lt;/em&gt; а не компилятором непосредственно. Для &lt;em&gt;Task&lt;/em&gt; результат &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;-выражения - &lt;em&gt;void&lt;/em&gt;, для &lt;em&gt;Task&amp;lt;TResult&amp;gt;&lt;/em&gt; – результат &lt;em&gt;TResult&lt;/em&gt;. &lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;“Внутри”, для поддержки функционала &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; устанавливается метод обратного вызова на задачу через &lt;em&gt;продолжение. &lt;/em&gt;Этот метод продолжит выполнение асинхронного метода с точки остановки. Когда выполнение асинхронного метода будет возобновлено, если задача &lt;em&gt;Task&amp;lt;TResult&amp;gt;&lt;/em&gt; находилась в ожидании и завершилась успешно, то будет возвращен &lt;em&gt;TResult&lt;/em&gt;. &lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Если выполнение &lt;em&gt;Task&lt;/em&gt; или &lt;em&gt;Task&amp;lt;TResult&amp;gt;&lt;/em&gt; завершилось состоянием отмены (&lt;em&gt;Canceled state&lt;/em&gt;), то будет выброшено исключение &lt;em&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.operationcanceledexception.operationcanceledexception(v=VS.100).aspx&quot; target=&quot;_blank&quot;&gt;OperationCanceledException&lt;/a&gt;. &lt;/em&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Если выполнение &lt;em&gt;Task&lt;/em&gt; или &lt;em&gt;Task&amp;lt;TResult&amp;gt;&lt;/em&gt; завершилось состоянием сбоя (&lt;em&gt;Faulted state&lt;/em&gt;), то будет выброшено соответствующее исключение, вызвавшее его. Возможно, что сбой будет вызван множеством исключений, в этом случае только одно из них будет выброшено, однако свойство &lt;em&gt;Exception &lt;/em&gt;в&lt;em&gt; Task&lt;/em&gt; будет содержать &lt;span style=&quot;line-height: 115%; font-family: &#39;Calibri&#39;,&#39;sans-serif&#39;; font-size: 11pt; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot; lang=&quot;EN-US&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.aggregateexception.aspx&quot; target=&quot;_blank&quot;&gt;AggregateException&lt;/a&gt;&lt;em&gt;&lt;/em&gt;, содержащий все ошибки.&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Если с потоком, выполняющим асинхронный метод, был ассоциирован &lt;em&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.threading.synchronizationcontext.aspx&quot; target=&quot;_blank&quot;&gt;SynchronizationContext&lt;/a&gt;&lt;/em&gt;&amp;nbsp; на момент приостановки (другими словами &lt;em&gt;SynchronizationContext.Current&lt;/em&gt;&amp;nbsp; не &lt;em&gt;null&lt;/em&gt;), возобновление работы асинхронного метода будет произведено в том же &lt;em&gt;SynchronizationContext&lt;/em&gt; за счет метода &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.threading.synchronizationcontext.post.aspx&quot; target=&quot;_blank&quot;&gt;Post&lt;/a&gt;. В противном случае, возобновление будет зависеть от текущего &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.threading.tasks.taskscheduler.aspx&quot; target=&quot;_blank&quot;&gt;System.Threading.Tasks.TaskScheduler&lt;/a&gt; на момент приостановки (как правило это &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.threading.tasks.taskscheduler.default.aspx&quot; target=&quot;_blank&quot;&gt;TaskScheduler.Default&lt;/a&gt;, соответствующий .NET &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.threading.threadpool.aspx&quot; target=&quot;_blank&quot;&gt;ThreadPool&lt;/a&gt;). Окончательное решение: разрешить возобновление непосредственно по окончанию выполнения асинхронного метода, или запланировать возобновление выполнения на будущее за &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/dd997402.aspx&quot; target=&quot;_blank&quot;&gt;TaskScheduler&lt;/a&gt; .&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;В момент вызова асинхронный метод выполняет тело метода синхронно до первого &lt;strong&gt;&lt;em&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;-выражения&lt;/em&gt;, &lt;/strong&gt;в этой точке он возвращает управление вызывающему. Если асинхронный метод не возвращает &lt;em&gt;void,&lt;/em&gt; то результатом будет &lt;em&gt;Task&lt;/em&gt; или &lt;em&gt;Task&amp;lt;TResult&amp;gt;&lt;/em&gt;, представляющие продолжающиеся вычисления (&lt;em&gt;напомню, в данный момент речь о поведении Framework-методов, а не компилятора в целом&lt;/em&gt;). &lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;После выполнения первого &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;&lt;/strong&gt;-выражения&lt;/em&gt;, оставшаяся часть тела метода эффективно выполняется одновременно (параллельно) с кодом, вызвавшем асинхронный метод. Когда же ожидаемая операция в теле метода завершится, начинается выполнение следующей части метода. Если встречается оператор &lt;em&gt;return &lt;/em&gt;или будет достигнут конец асинхронного метода, задача (&lt;em&gt;Task&lt;/em&gt;) считается завершенной в состоянии &lt;em&gt;RanToCompletion&lt;/em&gt;. Если будет выброшено необработанное исключение, прерывающее выполнение метода (выход за тело асинхронной функции), задача завершается состоянием &lt;em&gt;Faulted&lt;/em&gt; (если это исключение &lt;em&gt;OperationCanceledException&lt;/em&gt;, то вместо этого задача будет в состоянии &lt;em&gt;Canceled&lt;/em&gt;). В любом из вариантов, будет либо возвращен результат операции, либо исключения помешавшие этому.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Существует несколько важных отличий от описанного поведения. Для повышения производительности, в случае если задача уже завершила работу к моменту начала ожидания, переключения управления не будет производиться, а вместо этого сразу же продолжится выполнение метода. Кроме того, не всегда удобно и необходимо переключаться в тот же контекст из которого было начато ожидание. Подробнее об этом можно почитать у Stephen Toub в The Task-based Asynchronous Pattern (документация Async CTP).&lt;/p&gt;
&lt;hr&gt;

&lt;h5&gt;TPL Dataflow&lt;/h5&gt;
&lt;p align=&quot;justify&quot;&gt;Еще одно интересное добавление. TPL Dataflow (TDF) построена поверх функционального уровня TPL и дополняет его набором примитивов, для решения более сложных задач чем исходная библиотека. TDF использует задачи, потоково-безопасные коллекции и другие возможности, представленные в .NET 4 для добавления поддержки параллельной обработки параллельного потока данных. Она так же непосредственно интегрируется с новой поддержкой в языке асинхронного программирования. &lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Многие программные системы ориентированы на обработку потоков данных. Эти потоки данных часто большие или даже бесконечные, и/или требуют сложной обработки, приводя к потребностям в высокой скорости обработки и потенциально к очень большой вычислительной нагрузке. Чтобы справится с этими требованиями, были введены средства для распараллеливания обработки на доступные системные ресурсы, например, несколько ядер. Однако, модель параллельного программирования в сегодняшнем .NET Framework’е (включая .NET 4) не была разработана с мыслью о потоках данных, приводя к усложнению кода, низкоуровневым блокировкам и т.п., в&amp;nbsp; итоге уменьшая производительность системы, вводя проблемы с параллелизмом, которых можно было бы избежать в случае выбора модели более подходящей реактивным системам.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;TDF привносит несколько ключевых примитивов в TPL, позволяющих разработчикам описывать обработку основанную на графах потоков данных. Данные всегда обрабатываются асинхронно. С этой моделью нет необходимости явно запускать задачи для обработки, разработчики декларативно описывают зависимости между данными и среда выполнения планирует обработку основанную на асинхронном поступлении данных и описанных зависимостях. Таким образом, TDF генератор для задач (Task) подобно классу Parallel в PLINQ, но Parallel&amp;nbsp; и PLINQ специализируются на более структурированной модели параллельных вычислений, а TDF специализируется на неструктурированной асинхронной модели.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Есть некоторое подобие между TDF и Rx. Но если Rx преимущественно специализируется на координировании и композиции потоков событий с API основанном на LINQ, предоставляя богатый набор комбинаторов для манипулирования данными &lt;em&gt;IObservable&amp;lt;T&amp;gt;.&lt;/em&gt; В противоположность этому, TDF специализируется на строительных блоках для передачи сообщений и распараллеливания в процессорно- и IO-нагруженных приложениях, предоставляя при этом разработчикам явный контроль надо тем как данные буферизируются и перемещаются внутри системы.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Пример:&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Класс &lt;em&gt;ActionBlock&amp;lt;TInput&amp;gt;&lt;/em&gt; можно воспринимать логически как буфер данных, которые необходимо обработать вместе с задачами по обработке. В большинстве случаев можно просто создать экземпляр класса и “отправить” ему данные, делегат указанный при создании &lt;em&gt;ActionBlock,&lt;/em&gt; будет асинхронно выполняться для каждого отправленного набора данных.&lt;/p&gt;
&lt;div&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;var ab = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; ActionBlock&amp;lt;TInput&amp;gt;(&lt;span style=&quot;color: #0000ff&quot;&gt;delegate&lt;/span&gt;(TInput i)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    Compute(i);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;});&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;…&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;ab.Post(1);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;ab.Post(2);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;ab.Post(3);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Второй пример:&lt;/p&gt;
&lt;p&gt;Другим примером может быть тип &lt;em&gt;BufferBlock&amp;lt;T&amp;gt;, &lt;/em&gt;который можно считать как несвязанный буфер для данных, разрешающий как синхронные так и асинхронные сценарии производитель/потребитель. Для примера ниже код предающий данные между множеством производителей и потребителей.&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; BufferBlock&amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt;&amp;gt; m_buffer = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; BufferBlock&amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #008000&quot;&gt;// Производитель&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Producer()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;while&lt;/span&gt;(&lt;span style=&quot;color: #0000ff&quot;&gt;true&lt;/span&gt;)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; item = Produce();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        m_buffer.Post(item);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #008000&quot;&gt;// Потребитель&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; async Task Consumer()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;while&lt;/span&gt;(&lt;span style=&quot;color: #0000ff&quot;&gt;true&lt;/span&gt;)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; item = await m_buffer.ReceiveAsync();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        Process(item);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;TDF очень интересна, рекомендую почитать более подробно о ней в &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=205053&quot;&gt;документации&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;/p&gt;
&lt;h5&gt;Jeffrey Richter’s AsyncEnumurator и Async CTP&lt;/h5&gt;
&lt;p&gt;В своей рассылке, посвященной PowerThreading, Jeffrey Richter &lt;a href=&quot;http://tech.groups.yahoo.com/group/PowerThreading/message/836&quot;&gt;прокомментировал&lt;/a&gt; новый Async CTP. Переведу от его лица.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align=&quot;justify&quot;&gt;Я был серьёзно вовлечен в создание новых асинхронных возможностей, которые Microsoft добавила в следующие версии C#/VB.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Мы проводили ежемесячные встречи и опрос, который я просил пройти членов этой группы несколько месяцев назад, непосредственно повлиял на итоговую реализацию.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;По существу, новая возможность языка очень похожа на итераторы C# с тем исключением, что вместо ‘yield return’ используется await. Новое ключевое слово более естественно и может использоваться для выражения контекста, в противоположность операторному содержимому (yield return), который просто упрощает ваш код, улучшая его компоновку. Кроме того, асинхронные методы могут вызывать другие асинхронные методы, что является огромным улучшением&amp;nbsp; по сравнению с тем, что вам позволяли делать итераторы. Это позволяет вам иметь асинхронные подпрограммы, которые можно вызывать из других асинхронных (и не асинхронных) методов для улучшения структуры. Мой AsyncEnumerator так же поддерживает это, но довольно топорно.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Новые асинхронные возможности сконцентрированы на Task, что предоставляет три больших преимущества. Во-первых, это намного проще использования Begin/End/IAsyncResult. Во-вторых, это объединяет выполнение вычислительных операций и операций ввода/вывода вокруг единственной конструкции. В-третьих, они интегрируют работу с SynchronizationContext, что само по себе является большим улучшением по сравнению с Begin/End. Все это снижает сложность понимания концепции программистами и делает принципы работы более естественными. Кроме того, я не знаю собирается ли MS официально объявлять устаревшей или неподдерживаемой асинхронную модель на основе событий (event-based APM) (наподобие классов BackgroundWork и WebClient), но они непременно должны воспрепятствовать использованию этих классов людьми, использующими шаблоны на основе событий. Этот шаблон всегда имел множество проблем и я твёрдо уверен, что он вообще не должен использоваться. Новые асинхронные возможности намного лучше всего, что может предложить событийный подход.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Что касается AsyncEnumerator:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Он работает на .NET 2.0 и выше. Новые асинхронные возможности не будут работать на этих платформах, по факту они еще даже не выпущены.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Мне необходимо подробнее изучить детали, но я практически уверен, что новые асинхронные возможности имеют немного большие накладные расходы (overhead) по сравнению с AsyncEnumerator. С новыми возможностями вы создаете Task (объект с большим количеством полей в нем), оборачивая существующие в Framework Begin/End. То есть заканчиваете тем, что выделяете больше памяти и выполняете вызов вызова. Для людей, которые действительно беспокоятся о памяти/производительности, я практически уверен, что мой AsyncEnumerator использует меньше памяти и выполняется быстрее. Я не делал еще никаких исследований, чтобы привести конкретные числа.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align=&quot;justify&quot;&gt;Мой AsyncEnumerator по-прежнему предлагает некоторые возможности, которых нет в асинхронных нововведениях. Например, поддержка отладки в AsyncEnumerator гораздо лучше. AE так же дает вам возможность перехватывать события приостановки/возобновления в конечном автомате, это потребовалось для некоторых из моих клиентов для переноса состояния между потоками в процессе переключения конечного автомата с потока на поток. Я так же предоставляю способ не использовать SynchronizationContext, так что часть работы может быть выполнена в потоке GUI, а часть в рабочем потоке (&lt;em&gt;прим. такая возможность есть и у await/async&lt;/em&gt;). Новый асинхронный функционал всегда использует SynchronizationContext. Наконец, в некоторых случаях кодирование с использованием AE немного проще. Для примера, с использованием AE вы можете легко ждать окончания ‘n’ операций, в нововведении вам придется использовать методы-комбинаторы.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p align=&quot;justify&quot;&gt;Мне нравятся нововведения и это абсолютно точно правильное направление движения. Помните, что прямо сейчас они находятся в зародыше и в будущем команда добавит более хорошую поддержку отладки и другие возможности. Мой AsyncEnumerator будет оставаться доступным для всех кому потребуется поддержка .NET 2.0 и старше и я продолжу адаптировать его к новым возможностям C#/.NET, так чтобы людям не пришлось портировать весь свой код на новую модель. Я попробую улучшить новые асинхронные возможности лучшей поддержкой отладки и всем остальным, что предлагает AE на сегодняшний день. Я чувствую себя крайне ответственным перед пользователями AsyncEnumerator и собираюсь продолжать работу над ним. К тому же, я безусловно быстрее чем Microsoft смогу ответить на запрос и добавить новые возможности или исправления ошибок.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Лично, я очень горжусь AsyncEnumerator&amp;nbsp; и его успехом, сыгравшем огромную роль в индустрии и тем, что я смог помочь Microsoft в разработке новых асинхронных возможностей. Моей целью всегда было попытаться упростить их использование для других для построения масштабируемых и быстро реагирующих приложений и компонентов и чувство, что я играю значительную роль в этом очень приятно.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;/p&gt;
&lt;h5&gt;Async CTP и R#&lt;/h5&gt;
&lt;p align=&quot;justify&quot;&gt;В ReSharper поддержки для нового Async CTP пока не будет. Безусловно, поддержка для нового C# будет разрабатываться, когда он хоть как-то будет стандартизирован, в данный момент об этом говорить еще рано, так как все может еще поменяться, даже синтаксис.&lt;/p&gt;
&lt;p&gt;Так что, пока придется не обращать внимания на ошибки при открытии проектов, использующих новый синтаксис. &lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Проблема, не том, что придется поправить синтаксический анализатор, и даже не столько в том, что придется повторить работу компилятора, для соответствующей трансформации исходного кода. R# работает со “сломанным” исходным кодом, выполняя его анализ и обработку, придется внести существенные изменения в эти алгоритмы, а поскольку все еще может измениться, то это было бы довольно непрактичным.&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;/p&gt;
&lt;h5&gt;Информация по теме (или с чего начать?)&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=18712f38-fcd2-4e9f-9028-8373dc5732b2&quot;&gt;Visual Studio Async CTP&lt;/a&gt; (Страница загрузки)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://player.microsoftpdc.com/Session/1b127a7d-300e-4385-af8e-ac747fee677a&quot;&gt;The Future of C# and Visual Basic&lt;/a&gt; (PDC10 session by Anders Hejlsberg)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/vstudio/async.aspx&quot;&gt;Asynchronous Programming for C# and Visual Basic&lt;/a&gt; (MSDN)&lt;/p&gt;
&lt;h5&gt;&lt;a href=&quot;http://social.msdn.microsoft.com/Forums/en-US/async/threads&quot;&gt;Visual Studio Async CTP Forum&lt;/a&gt; &lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=204845&quot;&gt;C# Language Specification for Asynchronous Functions&lt;/a&gt; - (CSharp Spec) Asynchronous Functions (документация Async CTP)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=D7CCFEFA-123A-40E5-8ED5-8D2EDD68ACF4&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Asynchrony in .NET&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=204847&quot; target=&quot;_blank&quot;&gt;Stephen Toub, The Task-based Asynchronous Pattern&lt;/a&gt; (документация Async CTP)&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Visual Studio Async CTP for the rest of us&amp;hellip;&quot; href=&quot;http://michaelcrump.net/archive/2010/10/28/visual-studio-async-ctp-for-the-rest-of-ushellip.aspx&quot; target=&quot;_blank&quot;&gt;Установка Async CTP и начало работы&lt;/a&gt;, так же советую после установки заглянуть в документ Walkthrough: Getting Started with Async (документация Async CTP)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/b/ericlippert/archive/tags/async/&quot; target=&quot;_blank&quot;&gt;Блог Эрика Липперта по теме асинхронного программирования&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://nesteruk.wordpress.com/2010/10/31/async-await-csharp5/&quot;&gt;Дмитрий Нестерук - Async CTP: Async, Await и C#5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Reed Copsey: &lt;a href=&quot;http://reedcopsey.com/2010/10/28/c-5-async-part-1-simplifying-asynchrony-that-for-which-we-await/&quot;&gt;C# 5 Async, Part 1: Simplifying Asynchrony – That for which we await&lt;/a&gt;
&lt;p&gt;Jon Skeet: &lt;a href=&quot;http://msmvps.com/blogs/jon_skeet/archive/2010/10/29/initial-thoughts-on-c-5-s-async-support.aspx&quot;&gt;Initial thoughts on C# 5&#39;s async support&lt;/a&gt;
&lt;p&gt;Anoop Madhusudanan: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd997405.aspx&quot; target=&quot;_blank&quot;&gt;&lt;a href=&quot;http://amazedsaint.blogspot.com/2010/10/c-50-asynchrony-quick-look-at.html&quot;&gt;C# 5.0 Asynchrony – A Simple Intro and A Quick Look at async/await Concepts in the Async CTP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TPL With Other Asynchronous Patterns&lt;/a&gt; – использование TPL с другими асинхронными шаблонами.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=205053&quot; target=&quot;_blank&quot;&gt;Introduction to TPL Dataflow&lt;/a&gt; (документация Async CTP)&lt;/p&gt;
&lt;p&gt;Видео от ключевых разработчиков: &lt;a href=&quot;http://channel9.msdn.com/Shows/Going+Deep/Mads-Torgersen-Inside-C-Async&quot;&gt;Mads Torgersen&lt;/a&gt;, &lt;a href=&quot;http://channel9.msdn.com/Shows/Going+Deep/Lucian-Wischik-Inside-VBNET-Async&quot;&gt;Lucian Wischik&lt;/a&gt; и &lt;a href=&quot;http://channel9.msdn.com/Shows/Going+Deep/Stephen-Toub-Task-Based-Asynchrony-with-Async&quot;&gt;Stephen Toub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Интереснейшая серия статей по сравнению концепций асинхронного программирования в F# и C# от Tomas Petricek- &lt;a href=&quot;http://tomasp.net/blog/csharp-fsharp-async-intro.aspx&quot;&gt;Asynchronous C# and F# (I.): Simultaneous introduction&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;

&lt;p align=&quot;justify&quot;&gt;Обещанный пример консольного приложения, реализующего шаблон &lt;em&gt;&lt;strong&gt;&lt;font color=&quot;#0000ff&quot;&gt;await&lt;/font&gt;-выражений&lt;/strong&gt;&lt;/em&gt;, поддерживаемый новым компилятором. Ценность этого примера весьма сомнительна, но тем не менее, он позволит вам изучить, например, с помощью &lt;a href=&quot;http://reflector.red-gate.com&quot; target=&quot;_blank&quot;&gt;Reflector&lt;/a&gt; как именно производится трансформация исходного кода. Не забудьте добавить в References &lt;strong&gt;&lt;em&gt;AsyncCtpLibrary.dll, &lt;/em&gt;&lt;/strong&gt;чтобы не обижать компилятор.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;namespace&lt;/span&gt; AsyncTesters&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Program&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Awaiter&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; Action _continuation;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; Awaiter GetAwaiter()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;                Console.WriteLine(&lt;span style=&quot;color: #006080&quot;&gt;&quot;Init awaiter&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;                &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;this&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;bool&lt;/span&gt; BeginAwait(Action continuation)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;                Console.WriteLine(&lt;span style=&quot;color: #006080&quot;&gt;&quot;Begin await: {0}&quot;&lt;/span&gt;, continuation.Method.Name);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;                _continuation = continuation;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;                &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; EndAwait()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;                Console.WriteLine(&lt;span style=&quot;color: #006080&quot;&gt;&quot;End await&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Continue()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;                _continuation();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        async &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Test(Awaiter s)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            Console.WriteLine(&lt;span style=&quot;color: #006080&quot;&gt;&quot;Start testing&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            await s;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            Console.WriteLine(&lt;span style=&quot;color: #006080&quot;&gt;&quot;End testing&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            var awaiter = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Awaiter();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            Test(awaiter);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            Console.WriteLine(&lt;span style=&quot;color: #006080&quot;&gt;&quot;Test returns&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            awaiter.Continue();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;            Console.ReadLine();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;После запуска на консоль должно вывестись:&lt;/p&gt;
&lt;p&gt;Start testing &lt;br&gt;Init awaiter &lt;br&gt;Begin await: MoveNext &lt;br&gt;Test returns &lt;br&gt;End await &lt;br&gt;End testing &lt;br&gt;&lt;/p&gt;
&lt;p&gt;Повторюсь, особой практической ценности пример не несет, разве что демонстрирует идею использования нового механизма в компиляторе. За более подробными примерами можно обратиться к статье &lt;a href=&quot;http://msmvps.com/blogs/jon_skeet/archive/2010/10/30/c-5-async-investigating-control-flow.aspx&quot; target=&quot;_blank&quot;&gt;Jon Skeet: C# 5 async: investigating control flow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Удачи!&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/7000874763666241321/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/7000874763666241321' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/7000874763666241321'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/7000874763666241321'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/10/c-50.html' title='Асинхронное программирование и C# 5.0'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-2042362926054176711</id><published>2010-04-22T22:48:00.001+04:00</published><updated>2010-04-22T22:48:55.200+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio Addins"/><title type='text'>Улучшение справочной системы Visual Studio 2010</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Справочная система в новой Visual Studio 2010 с одной стороны сделала большой шаг вперед – новое, отлично проработанное API (MS Help 3 / Microsoft Help Viewer 1.0), с другой стороны - идущая в комплекте программа просмотра очень многих &lt;a href=&quot;https://connect.microsoft.com/VisualStudio/feedback/details/505032/help-is-missing-an-index#details&quot; target=&quot;_blank&quot;&gt;не устроила&lt;/a&gt;.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Microsoft утверждает, что просто не успела привести его к соответствующему виду:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align=&quot;justify&quot;&gt;A number of VS 2010 Beta 2 customers have asked why we did not deliver a Keyword Index as part of the new help system. We realize the importance of delivering a keyword index, but we were unable to deliver it in our first release. In this V1.0 release of help system, we first implemented an improved search capability in order to deliver a more familiar, consistent online and offline experience. We then implemented a keyword index feature based on our search catalog. Unfortunately, the results did not meet our quality bar and we determined that this feature would require more work than the Beta 2 timeline allowed. We are looking at implementing it for at future release.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;К счастью, решение все же есть и не одно. &lt;/p&gt;  &lt;p&gt;Первый вариант поставить расширение &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/en-US/4af86641-a302-4edf-9853-007bcc670b30&quot; target=&quot;_blank&quot;&gt;Keyword Index for Visual Studio 2010 Help Documentation&lt;/a&gt; , написанное Ryan Linton и позволяющее просматривать непосредственно в VS IDE.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4RLn7vk6WfnCyBdrEGWR8Ho6t7BqjB-m5xbcNNoNhR0gDpf1FwaIUZ3l_ITAvZ_GriPmtMX5cmnH6ODrjwoIWhuJVDSGnu_hXb8HKJW8G-3CuvYpopw2JCrsdRAlBdi0uzokvW1nf_uc/s1600-h/index1%5B3%5D.jpg&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px&quot; title=&quot;index1&quot; border=&quot;0&quot; alt=&quot;index1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0U68MuZsN_wtYJVspPo_GI-fl7MwlO0AkQY4kpo5wGdR3mHy7EoAYnizyiQiuja3JQGOfuwqjK_ziPn2GA7dtRe-GizQvt_MbOXTVMRNDJMdNnW-MO0oDjTPJIh4fb-t6w09hvOOuHzs/?imgmax=800&quot; width=&quot;444&quot; height=&quot;334&quot; /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Подробнее о том, как установить и что получится в результате можно посмотреть &lt;a href=&quot;http://mshcmigrate.helpmvp.com/news/helpviewerkeywordindexvs2010ext&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Второй вариант – воспользоваться &lt;a href=&quot;http://mshcmigrate.helpmvp.com/viewer&quot; target=&quot;_blank&quot;&gt;MS Help 3 Viewer&lt;/a&gt; , разработанный Rob Chandler, который позволит работать со справкой в привычном для Visual Studio 2008 виде :&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGAaFTGeJNZKWC6u0bR18cRuWqUfA2KOX9WdV5CQ-yk8leH3tqKKzPGBWOAZdpigrv4w4SVLVybqtoleRaQplDOdnMEmei73zEnANgohzsOfGk7mf3XtOKp4ao47dYGMfWQiUaYOR93II/s1600-h/h3vsc1%5B3%5D.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px&quot; title=&quot;h3vsc1&quot; border=&quot;0&quot; alt=&quot;h3vsc1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaSpbptMPV2BnFUcHucJAbOfoTIPrLZnBg_IdgHcNqNIDfAGmQoy5w-1pafz0R02qZ15NQbNwOp1QXSvDQheptMfhplu34UWtfNy-zK-eSxFjXTE3_VlnDyzQX5BUYPGporhpX-H73_Jo/?imgmax=800&quot; width=&quot;472&quot; height=&quot;361&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://mshcmigrate.helpmvp.com/viewer/vhelp&quot; target=&quot;_blank&quot;&gt;Справка по программе&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ссылки по теме:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://connect.microsoft.com/VisualStudio/feedback/details/505032/help-is-missing-an-index&quot; target=&quot;_blank&quot;&gt;Help is missing an index&lt;/a&gt; - Отзыв на Microsoft Connect.&lt;/p&gt;  &lt;p&gt;&lt;a title=&quot;The Helpware Group&quot; href=&quot;http://mshcmigrate.helpmvp.com/default&quot; target=&quot;_blank&quot;&gt;The Helpware Group&lt;/a&gt; – подборка информации и утилит по новой справочной системе, &lt;a href=&quot;http://www.helpware.net/mshelp3/&quot; target=&quot;_blank&quot;&gt;раздел, посвященный новому формату&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://weblog.helpware.net/&quot; target=&quot;_blank&quot;&gt;Блог Rob Chandler (Helpware Blog)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://mshcmigrate.helpmvp.com/news/helpviewerkeywordindexvs2010ext&quot; target=&quot;_blank&quot;&gt;Описание HelpViewerKeywordIndex VS 2010 Ext&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://mshcmigrate.helpmvp.com/viewer&quot; target=&quot;_blank&quot;&gt;MS Help 3 Viewer by The Helpware Group&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/2042362926054176711/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/2042362926054176711' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/2042362926054176711'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/2042362926054176711'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/visual-studio-2010.html' title='Улучшение справочной системы Visual Studio 2010'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0U68MuZsN_wtYJVspPo_GI-fl7MwlO0AkQY4kpo5wGdR3mHy7EoAYnizyiQiuja3JQGOfuwqjK_ziPn2GA7dtRe-GizQvt_MbOXTVMRNDJMdNnW-MO0oDjTPJIh4fb-t6w09hvOOuHzs/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-863261609057721727</id><published>2010-04-21T01:42:00.001+04:00</published><updated>2010-04-21T01:42:29.592+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><title type='text'>Shrinkr – проект с открытым исходным кодом для сокращения длины ссылок (URL) на основе ASP.NET MVC 2</title><content type='html'>&lt;p&gt;&lt;a href=&quot;http://shrinkr.codeplex.com/&quot; target=&quot;_blank&quot;&gt;Shrinkr&lt;/a&gt; – это ASP.NET MVC 2 проект с открытым, который можно использовать как демонстрацию подхода при разработке с использованием следующих инструментов:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;.Net Framework 4.0;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.asp.net/mvc/&quot; target=&quot;_blank&quot;&gt;ASP.NET MVC 2&lt;/a&gt; ;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://jquery.com/&quot; target=&quot;_blank&quot;&gt;jQuery&lt;/a&gt; 1.4.2 ;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/data/aa937723.aspx&quot; target=&quot;_blank&quot;&gt;Entity Framework&lt;/a&gt; 4 с использованием модели &lt;a href=&quot;http://blogs.msdn.com/efdesign/archive/2009/06/10/code-only.aspx&quot; target=&quot;_blank&quot;&gt;Code Only&lt;/a&gt;;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://github.com/kazimanzurrashid/AspNetMvcExtensibility&quot;&gt;AspNetMvcExtensibility&lt;/a&gt; – проект с открытым исходным кодом, содержащий универсальные, готовые к использованию компоненты, разработанные с использованием рекомендуемого подхода&amp;#160; для ASP.NET MVC;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.telerik.com/products/aspnet-mvc.aspx&quot; target=&quot;_blank&quot;&gt;Telerik Extensions для ASP.NET MVC&lt;/a&gt;&amp;#160; ;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.dotnetopenauth.net/&quot; target=&quot;_blank&quot;&gt;DotNetOpenAuth&lt;/a&gt; 3.4 для поддержки аутентификации через &lt;a href=&quot;http://openid.net/&quot; target=&quot;_blank&quot;&gt;OpenID&lt;/a&gt;,&amp;#160; &lt;a href=&quot;http://oauth.net/&quot; target=&quot;_blank&quot;&gt;OAuth&lt;/a&gt;;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://code.google.com/p/elmah/&quot; target=&quot;_blank&quot;&gt;Elmah&lt;/a&gt;&amp;#160; - (Error Logging Modules and Handlers) – для ведения журнала работы (лога)&amp;#160; и обработки исключений;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://code.google.com/p/moq/&quot; target=&quot;_blank&quot;&gt;MoQ&lt;/a&gt; 4 - mock framework в модульных тестах (unit tests); &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://xunit.codeplex.com/&quot; target=&quot;_blank&quot;&gt;xUnit&lt;/a&gt; 1.5 – framework для модульного тестирования. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Сервис можно посмотреть “вживую” &lt;a href=&quot;http://rdir.in&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Подробнее:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://shrinkr.codeplex.com/&quot; target=&quot;_blank&quot;&gt;Shrinkr на CodePlex&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://weblogs.asp.net/rashid/archive/2010/04/19/releasing-shrinkr-an-asp-net-mvc-url-shrinking-service.aspx&quot; target=&quot;_blank&quot;&gt;Releasing Shrinkr – An ASP.NET MVC Url Shrinking Service&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://mosesofegypt.net/post/Introducing-Shrinkr-The-URL-Shrinking-Service-built-with-ASPNET-MVC-2.aspx&quot; target=&quot;_blank&quot;&gt;Introducing Shrinkr The URL Shrinking Service built with ASP.NET MVC 2&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://weblogs.asp.net/rashid/archive/tags/Shrinkr/default.aspx&quot; target=&quot;_blank&quot;&gt;Серия статей на авторском сайте&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/863261609057721727/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/863261609057721727' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/863261609057721727'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/863261609057721727'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/shrinkr-url-aspnet-mvc-2.html' title='Shrinkr – проект с открытым исходным кодом для сокращения длины ссылок (URL) на основе ASP.NET MVC 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-1730459143583355631</id><published>2010-04-20T22:18:00.001+04:00</published><updated>2010-04-20T22:18:01.493+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="WPF"/><category scheme="http://www.blogger.com/atom/ns#" term="XAML"/><title type='text'>Преобразование Windows Forms в XAML (WF2XAML)</title><content type='html'>&lt;p&gt;Вышла новая (&lt;a href=&quot;http://www.ingeniumsoft.com/LinkClick.aspx?link=WF2XAML_BETA_0_6_0_0.zip&amp;amp;tabid=63&amp;amp;mid=398&amp;amp;language=en-US&quot; target=&quot;_blank&quot;&gt;0.6.0.0 BETA&lt;/a&gt;) версия конвертора &lt;a href=&quot;http://www.ingeniumsoft.com/Products/WinForm2XAML/tabid/63/language/en-US/Default.aspx&quot; target=&quot;_blank&quot;&gt;WF2XAML&lt;/a&gt;. &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Windows Forms to XAML Converter (WF2XAML) – это утилита для преобразования Windows Forms в WPF/Silverlight/Windows Phone XAML. Она основана на концепции шаблонов и, по словам автора, может быть полностью доработана для поддержки сторонних управляющих элементов и рендеринга пользовательского XAML.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Есть возможность применять заданные стили во время конвертирования с помощью указания собственного шаблона в конфигурационном файле.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Автор открыт для отзывов и предложений.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/dsenatore/archive/2010/04/16/windows-forms-to-xaml-version-0.6-beta.aspx&quot; target=&quot;_blank&quot;&gt;Блог автора&lt;/a&gt;, &lt;a href=&quot;http://www.ingeniumsoft.com/Products/WinForm2XAML/tabid/63/language/en-US/Default.aspx&quot; target=&quot;_blank&quot;&gt;Страница для загрузки&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipqQrLydWwrMl8rKIqwLZGCfY2XlZG8sE9zKabp_q__DSzLmokoQJMq-xzL9wsADJkDjtxag5s55XWSiXRE_gt0PK8NwOoWdeYYb9_F9J3fsINkYYi0EZpvEhlLwusD8Cr5FmVUqTjqtQ/s1600-h/Source%5B10%5D.jpg&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Source&quot; border=&quot;0&quot; alt=&quot;Source&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-KzQWT8WEfeHZNFXOnZLoqEj3DOUYjskkE6JzuqqOgl0ISCkf52Pz3MPrnpwhYG9AMAnMdQ3mj3hayEHSN0tDtDR-EevCgT3vpnrJnV6cTSRgEB72vbm9mO6Vy5TxeEbzeR-fb3V5sTI/?imgmax=800&quot; width=&quot;535&quot; height=&quot;345&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgYC-Iq8jIZnpz3fLYGGk6FZmspZR3KbJEADIaZcwuonXIsh6UmshSK2CIVhlFMOwXtyBCeah-dal3L6Qrpozwa0RK-kmhTdFvnSdUEBEItuvCdkt9wEnWycqC25mvOhbKOW3hob593YI/s1600-h/Destination%5B6%5D.jpg&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Destination&quot; border=&quot;0&quot; alt=&quot;Destination&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlJGMIOFV1KoG1O-hmLZ8GiTj6RHA1SUlP1RWLQ3IkAMdgQEnNUdztFUp0XgAlEp0huSYw6k9bbSC3ba9cU46OjaCibgV0tQKKmvf9JyF9zKELkccgxeYLCPWirKLYrmh4favoESevQ3A/?imgmax=800&quot; width=&quot;535&quot; height=&quot;345&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/1730459143583355631/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/1730459143583355631' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1730459143583355631'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1730459143583355631'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/windows-forms-xaml-wf2xaml.html' title='Преобразование Windows Forms в XAML (WF2XAML)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-KzQWT8WEfeHZNFXOnZLoqEj3DOUYjskkE6JzuqqOgl0ISCkf52Pz3MPrnpwhYG9AMAnMdQ3mj3hayEHSN0tDtDR-EevCgT3vpnrJnV6cTSRgEB72vbm9mO6Vy5TxeEbzeR-fb3V5sTI/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-6400495063737683207</id><published>2010-04-20T03:43:00.004+04:00</published><updated>2010-04-20T03:59:26.444+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="64-бит"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Переход от 32 к 64 битным приложениям</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;В середине 90x миграция из 16-битных систем на 32-битные шла своим чередом: с одной стороны преимущества явно видны, с другой &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot; target=&quot;_blank&quot;&gt;портирование&lt;/a&gt; сводило с ума многих разработчиков, так как требовало изучения новой модели памяти, нового API и измененной арифметики указателей.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;В наше время ситуация повторяется, но уже при переходе от 32-битных приложений к 64-битным. К счастью, изменения намного умереннее и для большинства приложений придется сделать совсем немного для успешного запуска 32-битного приложения на 64-битной системе. Благодаря технологиям виртуализации и особенностям CLR, .NET приложение может стать 64-битным автоматически.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Однако, преодоление &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa366778%28v=VS.85%29.aspx&quot;&gt;2Гб лимита&lt;/a&gt; (&lt;a href=&quot;http://support.microsoft.com/kb/294418&quot; target=&quot;_blank&quot;&gt;Ru&lt;/a&gt;) (&lt;a href=&quot;http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx&quot; target=&quot;_blank&quot;&gt;PAE&lt;/a&gt;) может стать затруднительным при использовании неуправляемого кода или несовместимых компонентов.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Для неуправляемых приложений все относительно просто, в случае, если они скомпилированы как 32-битное приложение, то они будут работать под управлением Windows-on-Windows (&lt;a href=&quot;http://www.viva64.com/terminology/WoW64_rus.html&quot; target=&quot;_blank&quot;&gt;WoW64&lt;/a&gt;), предоставляющей совместимую среду для “прозрачного” выполнения 32-битных приложений на всех 64-битных версиях Windows.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;В случае же управляемого приложения может показаться странным наличие каких-то проблем при переходе от 32-битной ОС к 64-битной, так как технически управляемый код является независимым от битности ОС и процессора (на самом деле там есть небольшая заглушка, но она не используется так как во всех современных ОС, включая последние 64-битные, загрузчик ОС непосредственно знает об управляемом коде). Однако несмотря на это есть некоторые подводные камни.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Для управляемых приложений можно указать как оно должно работать в 64-битной операционной системе: либо как &lt;a href=&quot;http://ru.wikipedia.org/wiki/Native_code&quot; target=&quot;_blank&quot;&gt;native application&lt;/a&gt;(x64), либо под управлением &lt;a href=&quot;http://www.viva64.com/terminology/WoW64_rus.html&quot; target=&quot;_blank&quot;&gt;WoW64&lt;/a&gt; (x86). &lt;/p&gt;  &lt;p&gt;Существует &lt;a href=&quot;http://blogs.msdn.com/aaronhallberg/archive/2007/06/25/solution-configurations.aspx&quot; target=&quot;_blank&quot;&gt;несколько целевых платформ&lt;/a&gt;, на которые разработчик может ориентироваться при разработке: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/zekwfyz4%28VS.80%29.aspx&quot; target=&quot;_blank&quot;&gt;AnyCPU , x86, x64, и Itanium&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;при компиляции в &lt;strong&gt;x86&lt;/strong&gt; сборка будет запущена в &lt;em&gt;32-битной&lt;/em&gt;, x86-совместимой CLR; &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;выбор &lt;strong&gt;Itanium&lt;/strong&gt; приводит к компиляции для работы под управлением &lt;em&gt;64-битной&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;CLR на компьютерах с процессором Itanium. Планируется &lt;a href=&quot;http://blogs.technet.com/windowsserver/archive/2010/04/02/windows-server-2008-r2-to-phase-out-itanium.aspx&quot; target=&quot;_blank&quot;&gt;прекращение поддержки&lt;/a&gt; данной платформы;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;компиляция в &lt;strong&gt;x64&lt;/strong&gt; ограничивает возможность работы &lt;em&gt;64-битной &lt;/em&gt;CLR на компьютерах, с процессорами, поддерживающими набор инструкций AMD64 или EM64T; &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;AnyCPU задает компиляцию сборки с возможностью работы на любой платформе. &lt;/li&gt; &lt;/ul&gt;  &lt;p align=&quot;justify&quot;&gt;Такое разделение появилось в связи с необходимостью поддержки &lt;a href=&quot;http://en.wikipedia.org/wiki/Legacy_code&quot; target=&quot;_blank&quot;&gt;устаревшего кода&lt;/a&gt;, несмотря на то, что .NET приложения сами по себе не зависят от битности ОС, многие из них зависят от неуправляемого кода, например, от дополнительных компонентов, которые по тем или иным причинам было решено использовать в процессе разработки приложения. Зачастую эти дополнительные компоненты/библиотеки и становятся тем камнем, что тянет управляемое приложение, не давая воспользоваться преимуществами независимой архитектуры.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;В 64-битной ОС&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;сборки, скомпилированные как &lt;strong&gt;x86&lt;/strong&gt; будут выполняться под управлением &lt;em&gt;32-битной&lt;/em&gt; CLR под управлением &lt;a href=&quot;http://ru.wikipedia.org/wiki/WOW64&quot; target=&quot;_blank&quot;&gt;WoW64&lt;/a&gt;; &lt;/li&gt;    &lt;li&gt;исполняемые файлы &lt;strong&gt;AnyCPU&lt;/strong&gt;&amp;#160; будут выполняться &lt;em&gt;64-битной&lt;/em&gt; CLR; &lt;/li&gt;    &lt;li&gt;библиотеки DLL &lt;strong&gt;AnyCPU &lt;/strong&gt;будут выполняться под управлением той же CLR, что и процесс, который их загрузил. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Для наглядности эта информация ниже приведена в табличном виде. В столбцах информация о моделях исполняемых файлах, в строках – динамических библиотек. В ячейках возможность загрузки соответствующей DLL. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;32-битная ОС&lt;/em&gt;:&lt;/p&gt;  &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;700&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;&amp;#160;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;AnyCPU.exe&lt;/p&gt;          &lt;p align=&quot;center&quot;&gt;32-битный процесс&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x86.exe&lt;/p&gt;          &lt;p align=&quot;center&quot;&gt;32-битный процесс&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x64.exe&lt;/p&gt;          &lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.badimageformatexception.aspx&quot; target=&quot;_blank&quot;&gt;BadImageFormatException&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;AnyCPU.dll&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;-&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x86.dll&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;-&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x64.dll&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.badimageformatexception.aspx&quot; target=&quot;_blank&quot;&gt;BadImageFormatException&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.badimageformatexception.aspx&quot; target=&quot;_blank&quot;&gt;BadImageFormatException&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;-&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;64-битная ОС&lt;/em&gt;:&lt;/p&gt;  &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;700&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;&amp;#160;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;AnyCPU.exe&lt;/p&gt;          &lt;p align=&quot;center&quot;&gt;64-битный процесс&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x86.exe&lt;/p&gt;          &lt;p align=&quot;center&quot;&gt;32-битный процесс&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x64.exe&lt;/p&gt;          &lt;p align=&quot;center&quot;&gt;64-битный процесс&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;AnyCPU.dll&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x86.dll&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.badimageformatexception.aspx&quot; target=&quot;_blank&quot;&gt;BadImageFormatException&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.badimageformatexception.aspx&quot; target=&quot;_blank&quot;&gt;BadImageFormatException&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;x64.dll&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;175&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/system.badimageformatexception.aspx&quot; target=&quot;_blank&quot;&gt;BadImageFormatException&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;174&quot;&gt;         &lt;p align=&quot;center&quot;&gt;успешная загрузка&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Чтобы определить &lt;a href=&quot;http://stackoverflow.com/questions/270531/how-to-determine-if-net-assembly-was-built-for-x86-or-x64&quot; target=&quot;_blank&quot;&gt;на какую платформу рассчитана сборка&lt;/a&gt; можно воспользоваться &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms164699%28v=VS.80%29.aspx&quot; target=&quot;_blank&quot;&gt;CorFlags Conversion Tool&lt;/a&gt; или программно с помощью метода &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.reflection.module.getpekind%28v=VS.80%29.aspx&quot; target=&quot;_blank&quot;&gt;System.Reflection.Module.GetPEKind&lt;/a&gt;.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Для неуправляемых приложений информация о платформе сохраняется в PE заголовке, поэтому для просмотра потребуется &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%94%D0%B0%D0%BC%D0%BF%D0%B5%D1%80&quot; target=&quot;_blank&quot;&gt;дампер&lt;/a&gt;. Можно воспользоваться стандартными средствами: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/c1h23y6c%28vs.71%29.aspx&quot; target=&quot;_blank&quot;&gt;dumpbin /HEADERS&lt;/a&gt;, сейчас этот функционал встроен в&amp;#160; &lt;a href=&quot;http://en.wikibooks.org/wiki/X86_Disassembly/Analysis_Tools&quot; target=&quot;_blank&quot;&gt;link.exe /dump /HEADERS&lt;/a&gt; Основное, на что надо обратить внимание в дампе – целевая машина: 8664 machine (&lt;strong&gt;x64&lt;/strong&gt;), 14C machine (&lt;strong&gt;x86&lt;/strong&gt;). В качестве альтернативы, можно попробовать воспользоваться &lt;a href=&quot;http://www.wheaty.net/downloads.htm&quot; target=&quot;_blank&quot;&gt;PEDump&lt;/a&gt; от Matt Pietrek, но у него несколько проблем: декодировать x64 значение придется вручную (8664), x86 названо как (i386) и он падает при анализе 64-бит DLL на 64-бит Windows 7, впрочем успевая вывести заголовок. При желании можете подкорректировать исходные тексты, чтобы этого избежать, если по каким-либо причинам использование link.exe /dump вас не устраивает.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Стоит ли переходить на 64 бит?&lt;/h4&gt;  &lt;p&gt;Как обычно в любом вопросе так или иначе связанном с производительностью - ответ зависит от конкретной ситуации. Так или иначе, ниже список плюсов и минусов, которые стоит принимать в расчет.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;важнейшим преимуществом 64-битных процессов является увеличенное адресное пространство; &lt;/li&gt;    &lt;li&gt;оптимизированная 64-битная математика; &lt;/li&gt;    &lt;li&gt;64-битной ядро ОС использует больший доступный объем памяти для улучшения многих аспектов работы. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;на многое требуется больше памяти (указатели занимают больше, а особенно в управляемом коде, где повсюду ссылки); &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;эффективная часть процессорного кэша меньше (если сравнивать 32-битный и 64-битный режимы работы) по той же причине; &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;увеличивается так же и размер кода, за счет дополнительных префиксов и инструкций, содержащих 8-ми байтовые операнды, вместо 4х байтных.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align=&quot;justify&quot;&gt;Это ведет к тому, что код, отлично работающий на 32-битах, не содержащий никакой 64-битной арифметики (т.е ни каким другим способом не использующий новые возможности 64-битного процессора), не испытывающий потребности в превышении 2Гб доступной памяти, от работы в 64 битной ОС получит только недостатки: больший потребляемый объем в памяти и некоторое замедление работы.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Однако, если приложение или набор приложений может получить какие-то преимущества по сравнению с указанными минусами, то это может стать решающим фактором. Например, многие приложения упираются в ограничения по памяти. Кроме того для некоторых приложений переход на 64-битную математику дает существенный прирост производительности. Например, приложениям для работы с графикой, кодированием видео и пр.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://blogs.msdn.com/rmbyers/archive/2009/06/8/anycpu-exes-are-usually-more-trouble-then-they-re-worth.aspx&quot; target=&quot;_blank&quot;&gt;Проблемы использования платформы AnyCPU&lt;/a&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;разработка под два различных режима (32-бит и 64-бит) увеличивает сложность продукта и стоимость тестирования. Очень часто неочевидно, что в случае зависимости приложения от неуправляемого кода необходимо удостовериться, что доступны версии этих компонентов в обоих вариантах и самое главное, что нужный из них автоматически выбирается. Большей частью это решается относительно просто за счет &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa384249%28v=VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;функций перенаправления ОС&lt;/a&gt;, однако может иногда приводить к проблемам.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;некоторые из возможностей недоступны в 64-битном исполнении: отладка x64 кода была добавлена только в CLR v4, до этого отладка была доступна только в смешанном режиме (x86). Функция “Исправить-и-продолжить (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bcew296c%28VS.80%29.aspx&quot; target=&quot;_blank&quot;&gt;edit-and-continue&lt;/a&gt;)” до сих пор не поддерживается в x64, та же самая участь постигла возможность исторической отладки (Historical Debugging, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd264915.aspx&quot; target=&quot;_blank&quot;&gt;IntelliTrace™&lt;/a&gt;) в VS 2010. Это следствие различной базы исходных кодов (например, полностью раздельные JIT компиляторы для 32-бит и 64-бит), приводящее к необходимости компромисса и невозможности реализации некоторого функционала из-за огромных временных затрат.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx&quot; target=&quot;_blank&quot;&gt;Причины, по которым до сих пор нет Visual Studio 64-бит&lt;/a&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;с точки зрения производительности - указатели становятся больше по размеру, соответственно увеличивается размер структур данных, а кэш процессора остается неизменным (уменьшается его эффективная часть) - в основном это приводит к чистой потере производительности. Другими словами, начиная в яме, вы пытаетесь из нее выбраться, используя дополнительную память больше 4Гб как вспомогательное средство для этого. Да, для некоторых огромных проектов это, возможно, и помогло бы, но предпочтительнее прооптимизировать размер используемых структур в первую очередь, что даст возможность обрабатывать больше на том же объеме.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;с точки зрения затрат, возможно, самый экономичный способ портировать Visual Studio на 64 бит – это переписать большую его часть на управляемый код, а затем дописать и все остальное. Стоимость такого портирования очень высока, кроме того она приведет к тому, что все известные расширения перестанут работать и придется создавать новую 64-битную экосистему подобно тому, как это делалось для драйверов. Несомненно существуют люди, которые бы могли воспользоваться преимуществами 64-битной версии, но лучше все же эти деньги потратить на уменьшение потребляемой памяти IDE, чем на портирование.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align=&quot;justify&quot;&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Проблемы при переходе&lt;/h4&gt;  &lt;p&gt;Как и в случае 32-битной ОС, существует &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms241064.aspx&quot; target=&quot;_blank&quot;&gt;2Гб ограничение&lt;/a&gt; на размер &lt;strong&gt;&lt;em&gt;одного&lt;/em&gt;&lt;/strong&gt; объекта, который можно создать при работе 64-битного управляемого приложения на 64-битной ОС.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Во многих случаях сборки работают одинаково на 32-битной и 64-битной версии CLR. Основные причины, по которым исполнение в 64-битной среде CLR может отличаться, следующие:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;изменение размеров структур, состоящих из членов, имеющих зависимый от платформы размер, например, указателей; &lt;/li&gt;    &lt;li&gt;арифметика с указателями, включающая операции с указанием константных размеров; &lt;/li&gt;    &lt;li&gt;некорректное определение &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa288468%28VS.71%29.aspx&quot; target=&quot;_blank&quot;&gt;P/Invoke&lt;/a&gt; или COM-объекта, задающее &lt;strong&gt;Int32&lt;/strong&gt; для хэндлов вместо &lt;strong&gt;IntPtr&lt;/strong&gt;; &lt;/li&gt;    &lt;li&gt;преобразование &lt;strong&gt;IntPtr&lt;/strong&gt; в &lt;strong&gt;Int32&lt;/strong&gt; при &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/asx0thw2%28v=VS.100%29.aspx&quot; target=&quot;_blank&quot;&gt;маршалинге&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p align=&quot;justify&quot;&gt;&amp;#160;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Охватить весь доступный материал практически невозможно в одной статье, так что рекомендую продолжить чтение по ссылкам ниже.&lt;/p&gt;  &lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;h4&gt;Рекомендуемые статьи / сайты&lt;/h4&gt;  &lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms973190.aspx&quot; target=&quot;_blank&quot;&gt;Migrating 32-bit Managed Code to 64-bit&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Find out what is involved in migrating 32-bit managed applications to 64-bit, issues that can impact migration, and the tools that are available to assist you.&lt;/p&gt;  &lt;p&gt;&lt;a title=&quot;http://www.viva64.com/ru/articles/64-bit-development/&quot; href=&quot;http://www.viva64.com/ru/articles/64-bit-development/&quot; target=&quot;_blank&quot;&gt;64 бита для программистов&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Сайт для C/C++ разработчиков 64-битных и параллельных приложений. &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a title=&quot;http://www.start64.com/index.php&quot; href=&quot;http://www.start64.com/index.php&quot;&gt;Start 64! - Start on 64&lt;/a&gt; &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Великолепный ресурс, посвященный всему 64 битному миру. Не пропустите &lt;a href=&quot;http://www.start64.com/index.php?option=com_content&amp;amp;task=blogcategory&amp;amp;id=54&amp;amp;Itemid=126&quot;&gt;технологические статьи&lt;/a&gt;.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://www.zizman.com/about-zizman&quot; target=&quot;_blank&quot;&gt;Zizman.coM&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Cайт посвящен &lt;strong&gt;x64&lt;/strong&gt; тематике. У нас вы сможете скачать последние &lt;strong&gt;новинки x64&lt;/strong&gt; софта (пока мы выкладываем только &lt;strong&gt;бесплатный&lt;/strong&gt; софт для &lt;strong&gt;Windows x64&lt;/strong&gt;), прочитать интересные статьи о &lt;strong&gt;64-битных &lt;/strong&gt;программах и системах.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://extended64.com/&quot; target=&quot;_blank&quot;&gt;Extended64 - The 64-Bit Windows Community&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Extended64 is a website dedicated to the 64-bit Windows platform. Our goal is to help users of all kinds, from the most experienced IT Professionals and Application Developers, to the home user who is just starting with 64-bit. Lead by highly experienced technology experts, Extended64 is a collaborative community where our members get to write their own tips and guides, ask questions, and answer other people&#39;s questions.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://msmvps.com/blogs/russel/default.aspx&quot;&gt;x(perts)64&lt;/a&gt; - The unofficial x64 FAQ&lt;/p&gt;  &lt;p&gt;&lt;a title=&quot;http://www.64bits.net/&quot; href=&quot;http://www.64bits.net/&quot; target=&quot;_blank&quot;&gt;64bits.net&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The mission of 64bits.net is to explore all aspects of the 64 bit generation of computing systems from the gory technicial details to the issues that drive the business need for these systems.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.viva64.com/art-1-1-3891492865.html&quot; target=&quot;_blank&quot;&gt;Введение в 64 бита для начинающих, или где же 64-битный мир?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Довольно давно появились 64-битные процессоры, операционные системы, отдельные программы. Однако полностью на 64 бита перешли еще далеко не все пользователи. В статье рассматриваются причины этого.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.start64.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=55&amp;amp;Itemid=1&quot;&gt;64 bits. What does it offer, and what does it not?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Good question. And here is the answer in a single sentence: We have everything and still, we have nothing. Of course, this sounds cynical and highly biased. The truth lies somewhere in the middle. It will probably be best for us to take a look around. A detailed analysis. &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://blogs.sepago.de/helge/2008/01/09/windows-x64-all-the-same-yet-very-different-part-1/&quot; target=&quot;_blank&quot;&gt;Windows x64 – All the Same Yet Very Different, Part 1: Virtual Memory&lt;/a&gt;, &lt;a href=&quot;http://blogs.sepago.de/helge/2008/01/23/windows-x64-all-the-same-yet-very-different-part-2/&quot; target=&quot;_blank&quot;&gt;Part 2: Kernel Memory, /3GB, PTEs, (Non-) Paged Pool&lt;/a&gt;, &lt;a href=&quot;http://blogs.sepago.de/helge/2008/02/05/windows-x64-all-the-same-yet-very-different-part-3/&quot; target=&quot;_blank&quot;&gt;Part 3: CPUs, AMD64, Intel 64, EM64T, Itanium&lt;/a&gt;, &lt;a href=&quot;http://blogs.sepago.de/helge/2008/02/20/windows-x64-all-the-same-yet-very-different-part-4/&quot; target=&quot;_blank&quot;&gt;Part 4: Code Trees, Drivers&lt;/a&gt;, &lt;a href=&quot;http://blogs.sepago.de/helge/2008/03/11/windows-x64-all-the-same-yet-very-different-part-5/&quot; target=&quot;_blank&quot;&gt;Part 5: NTVDM, Services, WoW64&lt;/a&gt;, &lt;a href=&quot;http://blogs.sepago.de/helge/2008/04/02/windows-x64-all-the-same-yet-very-different-part-6/&quot; target=&quot;_blank&quot;&gt;Part 6: COM, DLLs and Processes&lt;/a&gt;, &lt;a href=&quot;http://blogs.sepago.de/helge/2008/04/20/windows-x64-all-the-same-yet-very-different-part-7/&quot; target=&quot;_blank&quot;&gt;Part 7: File System and Registry Redirection, Registry Reflection&lt;/a&gt; , &lt;a href=&quot;http://blogs.sepago.de/helge/2008/05/25/x64-my-terminal-servers-run-just-fine-with-32-bits-and-81216-gb-ram/&quot; target=&quot;_blank&quot;&gt;x64? My Terminal Servers Run Just Fine With 32 Bits and 8/12/16 GB RAM!&lt;/a&gt;, &lt;a href=&quot;http://blogs.sepago.de/helge/2009/07/25/x64-divided-by-two-is-not-x32/&quot; target=&quot;_blank&quot;&gt;x64 Divided by Two is NOT x32!&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Серия статей, посвященных Windows x64, произошедшим изменениях, ключевым ограничениям x86-32 платформы, особенностям процессов и разработки на 64 битных платформах.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.viva64.com/art-1-1-1148261225.html&quot; target=&quot;_blank&quot;&gt;7 шагов по переносу программы на 64-битную систему&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;В статье рассмотрены основные шаги, обеспечивающие корректный перенос 32-битных Windows приложений на 64-битные Windows системы. Хотя статья ориентирована на разработчиков, использующих язык Си/Си++ в среде Visual Studio 2005/2008, она будет полезна и другим разработчикам, планирующим перенос своих приложений под 64-битные системы.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a title=&quot;http://social.msdn.microsoft.com/Forums/ru-RU/netfx64bit/threads&quot; href=&quot;http://social.msdn.microsoft.com/Forums/ru-RU/netfx64bit/threads&quot; target=&quot;_blank&quot;&gt;64-Bit .NET Framework Development&lt;/a&gt; (MSDN Forum)&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Need help making your .net applications (any language) work on 64-bit? Ask your questions here!&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms241066.aspx&quot; target=&quot;_blank&quot;&gt;Visual Studio Development Environment 64-Bit Support&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;I&lt;/strong&gt;nformation on features in the Visual Studio development environment that help you create 64-bit applications.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.viva64.com/art-1-1-2124188686.html&quot; target=&quot;_blank&quot;&gt;Архитектура AMD64 (EM64T)&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://ru.wikipedia.org/wiki/X64&quot; target=&quot;_blank&quot;&gt;x86-64&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;x86-64&lt;/b&gt; (также &lt;b&gt;x64&lt;/b&gt;/&lt;b&gt;AMD64&lt;/b&gt;/&lt;b&gt;Intel64&lt;/b&gt;/&lt;b&gt;EM64T&lt;/b&gt;) — &lt;a href=&quot;http://ru.wikipedia.org/wiki/64_%28%D1%87%D0%B8%D1%81%D0%BB%D0%BE%29&quot;&gt;64&lt;/a&gt;-&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82&quot;&gt;битная&lt;/a&gt; &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B0&quot;&gt;аппаратная платформа&lt;/a&gt;: &lt;a href=&quot;http://ru.wikipedia.org/w/index.php?title=%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0&amp;amp;action=edit&amp;amp;redlink=1&quot;&gt;архитектура микропроцессора&lt;/a&gt; и соответствующий набор инструкций и &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D0%BF%D1%81%D0%B5%D1%82&quot;&gt;чипсет&lt;/a&gt;, разработанные компанией &lt;a href=&quot;http://ru.wikipedia.org/wiki/AMD&quot;&gt;AMD&lt;/a&gt;. Это &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B_x86&quot;&gt;расширение архитектуры x86&lt;/a&gt; с полной обратной совместимостью. Корпорации &lt;a href=&quot;http://ru.wikipedia.org/wiki/Microsoft&quot;&gt;Microsoft&lt;/a&gt; и &lt;a href=&quot;http://ru.wikipedia.org/wiki/Sun_Microsystems&quot;&gt;Sun Microsystems&lt;/a&gt; используют для обозначения этого набора инструкций термин &amp;quot;x64&amp;quot;, однако каталог с файлами для архитектуры в дистрибутивах Microsoft называется &amp;quot;amd64&amp;quot; (ср. &amp;quot;i386&amp;quot; для архитектуры x86).&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://blogs.msdn.com/oldnewthing/archive/2004/01/02/47184.aspx&quot; target=&quot;_blank&quot;&gt;The history of calling conventions, part 1&lt;/a&gt;, &lt;a href=&quot;http://blogs.msdn.com/oldnewthing/archive/2004/01/07/48303.aspx&quot; target=&quot;_blank&quot;&gt;part 2&lt;/a&gt;, &lt;a href=&quot;http://blogs.msdn.com/oldnewthing/archive/2004/01/08/48616.aspx&quot; target=&quot;_blank&quot;&gt;part 3&lt;/a&gt;, &lt;a href=&quot;http://blogs.msdn.com/oldnewthing/archive/2004/01/13/58199.aspx&quot; target=&quot;_blank&quot;&gt;part 4: ia64&lt;/a&gt;, &lt;a href=&quot;http://blogs.msdn.com/oldnewthing/archive/2004/01/14/58579.aspx&quot; target=&quot;_blank&quot;&gt;part 5: amd64&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://support.microsoft.com/kb/896456/ru&quot; target=&quot;_blank&quot;&gt;Обзор проблем совместимости для 32-разрядных программ в 64-разрядных версиях Windows Server 2003 и Windows XP&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;В этой статье описаны некоторые проблемы совместимости для 32-разрядных программ в 64-разрядных версиях Windows Server 2003 и Windows XP. В ней сравниваются 32-разрядные и 64-разрядные версии Windows Server 2003, Windows XP или других 64-разрядных операционных систем. В данной статье предполагается, что читатель понимает различие между 32-разрядными и 64-разрядными двоичными кодами.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/dd335933.aspx&quot; target=&quot;_blank&quot;&gt;Все, что нужно знать, чтобы начать программировать для 64-разрядных версий Windows&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;В данной статье я поделюсь квинтэссенцией своих знаний в области Win64 и архитектуры x64 - тем минимумом, который необходим опытному Win32-программисту для перехода на платформу x64. При этом я исхожу из того, что вам известны базовые концепции Win32 и платформы x86 и вы понимаете, зачем ваш код должен работать в Win64. Это позволит мне не отвлекаться от основной тематики. В общем, считайте мою статью обзором, где рассматриваются лишь наиболее важные различия архитектур Win64/x64 и Win32/x86.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms241064%28VS.80%29.aspx&quot; target=&quot;_blank&quot;&gt;64-bit Applications on MSDN&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Beginning in Visual Studio 2005 you can compile your application and specify that it should run on a 64-bit operating system either as a native application or under WOW64. WOW64 is a compatibility environment provided by the operating system that allows a 32-bit application to run on a Windows 64-bit operating system. &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb427430%28VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;Programming Guide for 64-bit Windows&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Microsoft has released 64-bit versions of the Windows operating system, such as 64-bit Windows Vista, Windows XP Professional x64 Edition, and Windows Server 2003 R2 x64 Enterprise Edition. 64-bit Windows was designed with compatibility in mind. Developers can ensure that their existing 32-bit applications run well under 64-bit Windows or take advantage of the benefits of 64-bit Windows by migrating their applications.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://www.codeguru.com/csharp/.net/article.php/c16921__1/&quot;&gt;Understanding .NET application options for 32 and 64-bit systems&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;In this article, you are going to learn the basics of moving your ,.NET &amp;amp; C# applications to 64-bit systems. Along the way, you are also going to learn a bit about memory management, code compatibility, and discover migration tips.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx&quot; target=&quot;_blank&quot;&gt;Physical Address Extension - PAE Memory and Windows&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;PAE is an Intel-provided memory address extension that enables support of greater than 4 GB of physical memory for most 32-bit (IA-32) Intel Pentium Pro and later platforms. This article provides information to help device driver developers implement Windows drivers that support PAE. Исключительно для ознакомления.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/visualc/aa336463.aspx&quot; target=&quot;_blank&quot;&gt;Visual C++ Developer Center 64-Bit Programming&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The current version of 64-bit Windows supports the x64 and Intel Itanium Processor Family, and is built for the highest levels of scalability. It has support for up to 64 processors and 16-terabyte (TB) of memory (architectural limit). This page contains links to information for developers interested in creating 64-bit applications.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/cc300794.aspx&quot; target=&quot;_blank&quot;&gt;Everything You Need To Know To Start Programming 64-Bit Windows Systems by Matt Pietrek&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In this article I&#39;ll boil down my experiences with Win64 and the x64 architecture to the essentials that a hotshot Win32® programmer needs for the move to x64. I&#39;ll assume that you know basic Win32 concepts, basic x86 concepts, and why your code should run on Win64. This frees me to focus on the good stuff. Think of this overview as a look at just the important differences relative to your knowledge of Win32 and the x86 architecture. &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/joshwil/archive/2006/07/18/670090.aspx&quot; target=&quot;_blank&quot;&gt;Should I choose to take advantage of 64-bit?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here&#39;s the guts of a response that I posted a while back to an internal mailing list re: tradeoffs of runing your managed code as 64-bit vs 32-bit. YMMV, and I&#39;ll remind you that every perf question has a thousand answers depending on the situation.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/rmbyers/archive/2009/06/8/anycpu-exes-are-usually-more-trouble-then-they-re-worth.aspx&quot; target=&quot;_blank&quot;&gt;AnyCPU Exes are usually more trouble than they&#39;re worth&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Over the past few months I&#39;ve had some interesting debates with folks here (and some customers) about the cost/benefit trade-off of &amp;quot;AnyCPU&amp;quot; (architecture-neutral) managed EXEs.&amp;#160; I think we&#39;ve converged on a consensus that most of the time they&#39;re not what you want and so shouldn&#39;t be the default in Visual Studio.&amp;#160; I suspect this topic may interest (and even shock) some folks, so I thought I&#39;d share the rationale with you here.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx&quot; target=&quot;_blank&quot;&gt;Visual Studio: Why is there no 64 bit version? (yet)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;From time to time customers or partners ask me about our plans to create a 64 bit version of Visual Studio. When is it coming? Why aren’t we making it a priority? Haven’t we noticed that 64 bit PC’s are very popular? Things like that. We just had an internal discussion about “the 64 bit issue” and so I thought I would elaborate a bit on that discussion for the blog-o-sphere.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/6400495063737683207/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/6400495063737683207' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/6400495063737683207'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/6400495063737683207'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/32-64.html' title='Переход от 32 к 64 битным приложениям'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-309706369991149439</id><published>2010-04-18T03:31:00.001+04:00</published><updated>2010-04-18T03:31:30.832+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><title type='text'>Улучшения в программе установки .NET Framework 4</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Основное на чем сосредоточились разработчики – это &lt;strong&gt;Размер&lt;/strong&gt;, &lt;strong&gt;Устойчивость к ошибкам &lt;/strong&gt;и &lt;strong&gt;Производительность&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Размер &lt;/strong&gt;распространяемого пакета был значительно уменьшен. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Сравнение размеров распространяемого пакета, начиная с 3.5 SP1&lt;/strong&gt;&lt;/p&gt;  &lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;418&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td width=&quot;162&quot;&gt;&amp;#160;&lt;/td&gt;        &lt;td width=&quot;62&quot;&gt;&lt;strong&gt;3.5 SP1&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;58&quot;&gt;&lt;strong&gt;4 Beta1&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;65&quot;&gt;&lt;strong&gt;4 Beta2&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;69&quot;&gt;&lt;strong&gt;4 RTM&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;162&quot;&gt;&lt;strong&gt;32bit Client Profile&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;62&quot;&gt;X&lt;/td&gt;        &lt;td width=&quot;58&quot;&gt;34.5 MB&lt;/td&gt;        &lt;td width=&quot;65&quot;&gt;31.5 MB&lt;/td&gt;        &lt;td width=&quot;69&quot;&gt;28.8 MB&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;162&quot;&gt;&lt;strong&gt;32bit Full&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;62&quot;&gt;X&lt;/td&gt;        &lt;td width=&quot;58&quot;&gt;77.5 MB&lt;/td&gt;        &lt;td width=&quot;65&quot;&gt;38.5 MB&lt;/td&gt;        &lt;td width=&quot;69&quot;&gt;35.3 MB&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;162&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=e5ad0459-cbcc-4b4f-97b6-fb17111cf544&quot; target=&quot;_blank&quot;&gt;32+64bit Client Profile&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;62&quot;&gt;X&lt;/td&gt;        &lt;td width=&quot;58&quot;&gt;72.5 MB&lt;/td&gt;        &lt;td width=&quot;65&quot;&gt;48.2 MB&lt;/td&gt;        &lt;td width=&quot;69&quot;&gt;41 MB&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;162&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&quot; target=&quot;_blank&quot;&gt;32+64bit Full&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;62&quot;&gt;237 MB&lt;/td&gt;        &lt;td width=&quot;58&quot;&gt;162.6 MB&lt;/td&gt;        &lt;td width=&quot;65&quot;&gt;55.9 MB &lt;/td&gt;        &lt;td width=&quot;69&quot;&gt;48.1 MB&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Для достижения такого результата были предприняты следующие шаги:&lt;/p&gt;  &lt;p&gt;- улучшена используемая технология сжатия, что позволило сократить размер на 15%;    &lt;br /&gt;- разделены пакеты для &lt;a href=&quot;http://ru.wikipedia.org/wiki/X86-64&quot; target=&quot;_blank&quot;&gt;AMD64&lt;/a&gt; и &lt;a href=&quot;http://ru.wikipedia.org/wiki/X86-64&quot; target=&quot;_blank&quot;&gt;IA64&lt;/a&gt;, так как в большинстве случаев они не требуются вместе;     &lt;br /&gt;- были идентифицированы сборки функционально идентичные, но включенные ранее в нескольких вариантах под разные архитектуры, несмотря на то, что они были &lt;a href=&quot;http://blogs.msdn.com/joshwil/archive/2005/04/08/406567.aspx&quot; target=&quot;_blank&quot;&gt;процессорно-нейтральными&lt;/a&gt; (без зависимостей от x86 или amd64 архитектуры). Теперь эти сборки включены в одном экземпляре.     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Устойчивость к ошибкам &lt;/strong&gt;значительно повысилась по сравнению с предыдущими релизами. Этого удалось добиться за счет следующего:&lt;/p&gt;  &lt;p&gt;- удаление большого числа зависимостей и объединение инсталлятора в единый &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc185688%28v=VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;MSI&lt;/a&gt;;     &lt;br /&gt;    &lt;br /&gt;- упрощение &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc185688%28v=VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;MSI&lt;/a&gt; за счет удаления и упрощения большого числа скриптов (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa368066%28VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;custom actions&lt;/a&gt;);     &lt;br /&gt;    &lt;br /&gt;- было проанализировано огромное число вариантов сбоев при установке, которые поддаются исправлению тем или иным способом, и реализованы шаги, предложенные в соответствующих &lt;a href=&quot;http://support.microsoft.com/&quot; target=&quot;_blank&quot;&gt;KB&lt;/a&gt;, тем самым добавилась возможность исправить многие известные проблемы при установке, приведя ПК в порядок и, при необходимости, успешно повторить установку;    &lt;br /&gt;    &lt;br /&gt;- после исследования проблем загрузки было решено использовать все три доступных способа для получения файлов: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa382925%28VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;Winhttp&lt;/a&gt;, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa902517%28v=MSDN.10%29.aspx&quot; target=&quot;_blank&quot;&gt;URLMon&lt;/a&gt;, и &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa362708%28VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;BITS&lt;/a&gt;, так как они сбоят в разных ситуациях и в тех случаях, когда один из способов недоступен, второй или третий может исправить ситуацию;&lt;/p&gt;  &lt;p&gt;- &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc656912%28v=VS.100%29.aspx&quot; target=&quot;_blank&quot;&gt;Client Profile&lt;/a&gt; инсталлятор так же упрощен за счет того, что конфигурирование компонентов наподобие &lt;a href=&quot;http://www.asp.net/&quot; target=&quot;_blank&quot;&gt;ASP.NET&lt;/a&gt; и &lt;a href=&quot;http://msdn.microsoft.com/en-us/netframework/aa663324.aspx&quot; target=&quot;_blank&quot;&gt;WCF&lt;/a&gt; было вынесено в полную версию, так как она зачастую они использовались только при установке на сервер и не использовались клиентскими приложениями.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;Производительность&lt;/strong&gt;. Ключевым показателем производительности является общее время установки. 3.5 SP1 устанавливался в среднем 12-15 минут. В 4й версии среднее время составляет 3-5 минут для клиентского профиля и 5-7 минут для полного. Проведены были следующие работы:&lt;/p&gt;  &lt;p&gt;- исправлены ошибки при обработке файлов, устанавливающихся в несколько мест одновременно (&lt;a href=&quot;http://robmensching.com/blog/posts/2007/6/1/quotSmart-cabbingquot-added-to-WiX-toolset&quot; target=&quot;_blank&quot;&gt;Smart Cabbing&lt;/a&gt;), ранее их наличие в проекте (&lt;a href=&quot;http://wix.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;WiX&lt;/a&gt;) приводило к заметному падению производительности;     &lt;br /&gt;    &lt;br /&gt;- одной из целей при разработке было упростить установку &lt;a href=&quot;http://msdn.microsoft.com/en-us/netframework/default.aspx&quot; target=&quot;_blank&quot;&gt;.NET Framewok&lt;/a&gt;, удалив различные зависимости, тем самым уменьшая и полное время установки, за счет уменьшения количества устанавливаемых компонентов. В некоторых случаях, это стало возможным, потому что требуемый функционал был встроен во все поддерживаемые ОС, либо был достаточно распространенным с тем, чтобы не беспокоиться о его наличии;     &lt;br /&gt;    &lt;br /&gt;- было обнаружено, что интеграция большого числа &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa370578%28VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;патчей&lt;/a&gt; в продукт приводила к большой потере производительности в конце установки во время кэширования для &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa371859%28VS.85%29.aspx&quot; target=&quot;_blank&quot;&gt;защиты от сбоя исходного пакета&lt;/a&gt;. С помощью добавления всего набора&amp;#160;&amp;#160; непосредственно в MSI удалось убрать эти задержки;     &lt;br /&gt;    &lt;br /&gt;- в &lt;a href=&quot;http://msdn.microsoft.com/en-us/netframework/aa663296.aspx&quot; target=&quot;_blank&quot;&gt;CLR&lt;/a&gt; была реализована возможность &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/6t9t5wcf%28VS.71%29.aspx&quot; target=&quot;_blank&quot;&gt;генерации образов в машинном коде&lt;/a&gt; на нескольких ядрах параллельно, инсталлятор теперь использует эту возможность, значительно увеличивая скорость работы на многоядерных машинах. Кроме того, на 64битных системах большинство .NET кода по-прежнему использует 32бит, поэтому была убрана синхронная (во время установки) генерация образов в машинных кодах для 64битных сборок;     &lt;br /&gt;    &lt;br /&gt;- можно использовать Web-вариант установки как для &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab&quot; target=&quot;_blank&quot;&gt;клиентского профиля&lt;/a&gt;, так и &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&amp;amp;displaylang=en&quot; target=&quot;_blank&quot;&gt;полной версии&lt;/a&gt; , при этом для полной версии происходит распараллеливание процессов: пока ставится клиентский профиль .NET Framework, продолжается загрузка остальной части, недостающей до полной версии и если ширина канала достаточна, то вполне может получиться значительная экономия времени, так как к окончанию установки клиентского профиля будет загружено все необходимое для продолжения установки.&lt;/p&gt;  &lt;p&gt;Подробнее:&lt;/p&gt;  &lt;p&gt;Блог &lt;a href=&quot;http://blogs.msdn.com/pmarcu/default.aspx&quot;&gt;Peter Marcu&lt;/a&gt;, пост об &lt;a href=&quot;http://blogs.msdn.com/pmarcu/archive/2010/04/15/the-net-framework-4-installer-improvements.aspx&quot; target=&quot;_blank&quot;&gt;улучшениях в инсталляторе&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/309706369991149439/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/309706369991149439' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/309706369991149439'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/309706369991149439'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/net-framework-4.html' title='Улучшения в программе установки .NET Framework 4'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-1847833128813565984</id><published>2010-04-15T19:21:00.001+04:00</published><updated>2010-04-15T19:21:00.230+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Книги"/><title type='text'>Бесплатная книга: Introducing Microsoft SQL Server 2008 R2</title><content type='html'>&lt;p&gt;Доступна для скачивания книга в электронном виде: Introducing Microsoft SQL Server 2008 R2 (Введение в Microsoft SQL Server 2008 R2), написанная Ross Mistry и Stacia Misner: &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=189148&quot;&gt;XPS&lt;/a&gt; или &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=189147&quot;&gt;PDF&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Книга для всех, кому интересен SQL Server 2008 R2 и его возможности.&lt;/p&gt;  &lt;p&gt;Книга разбита на 2 части по 5 глав:&lt;/p&gt;  &lt;p&gt;PART I DATABASE ADMINISTRATION    &lt;br /&gt;CHAPTER 1 SQL Server 2008 R2 Editions and Enhancements     &lt;br /&gt;CHAPTER 2 Multi-Server Administration     &lt;br /&gt;CHAPTER 3 Data-Tier Applications     &lt;br /&gt;CHAPTER 4 High Availability and Virtualization Enhancements     &lt;br /&gt;CHAPTER 5 Consolidation and Monitoring&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;PART II BUSINESS INTELLIGENCE DEVELOPMENT     &lt;br /&gt;CHAPTER 6 Scalable Data Warehousing     &lt;br /&gt;CHAPTER 7 Master Data Services     &lt;br /&gt;CHAPTER 8 Complex Event Processing with StreamInsight     &lt;br /&gt;CHAPTER 9 Reporting Services Enhancements     &lt;br /&gt;CHAPTER 10 Self-Service Analysis with PowerPivot&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/microsoft_press/archive/2010/04/14/free-ebook-introducing-microsoft-sql-server-2008-r2.aspx&quot; target=&quot;_blank&quot;&gt;Подробная информация&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/1847833128813565984/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/1847833128813565984' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1847833128813565984'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1847833128813565984'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/introducing-microsoft-sql-server-2008.html' title='Бесплатная книга: Introducing Microsoft SQL Server 2008 R2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-8615116221588396838</id><published>2010-04-15T17:25:00.000+04:00</published><updated>2010-04-15T17:25:51.417+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Статьи"/><title type='text'>Shock Diamonds and Mach Disks</title><content type='html'>Впервые натолкнулся на &lt;a href=&quot;http://www.aerospaceweb.org/question/propulsion/q0224.shtml&quot; target=&quot;_blank&quot;&gt;объяснение интересного эффекта&lt;/a&gt;: в выбросе самолетного или ракетного двигателя (особенно на форсаже) часто наблюдается серия дисков или колец. С чем это связано?&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg4eCbfyN01DHs0D-9gBSRwmAppZ0fkBJqdhnmq9xpS3ixVKwGO5cC5gUbGqyb_FFCPJQubz7XQkoKFZvfTXCFYTq-geAmZNs1i_LdC2CDLkCR7i0zw3ZB7Z5YuGa9ydV9MacA_BlH7zM/s1600-h/sr71_18%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;sr71_18&quot; border=&quot;0&quot; height=&quot;389&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVSP0-iuGT25hy3fNppZJ6aJdHdgCp9GxtSYfW_gwTb2umvQvmX8V5GA6Majdvh-Bs_sJ_tTJicbN5LeCS5YQZa90zuExzH3bPp-bTDdc7qF2GgKV-E5qVcWvH1QihCUAsBuXKeWr-cQ/?imgmax=800&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;sr71_18&quot; width=&quot;532&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
В дополнение рекомендую почитать весьма обширную и познавательную статью по &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%92%D0%BE%D0%B7%D0%B4%D1%83%D1%88%D0%BD%D0%BE-%D1%80%D0%B5%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B4%D0%B2%D0%B8%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C&quot; target=&quot;_blank&quot;&gt;воздушно-реактивным двигателям&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/8615116221588396838/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/8615116221588396838' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/8615116221588396838'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/8615116221588396838'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/shock-diamonds-and-mach-disks.html' title='Shock Diamonds and Mach Disks'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVSP0-iuGT25hy3fNppZJ6aJdHdgCp9GxtSYfW_gwTb2umvQvmX8V5GA6Majdvh-Bs_sJ_tTJicbN5LeCS5YQZa90zuExzH3bPp-bTDdc7qF2GgKV-E5qVcWvH1QihCUAsBuXKeWr-cQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-1884762225152119710</id><published>2010-04-15T17:02:00.002+04:00</published><updated>2010-04-15T17:26:14.245+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="patterns and practices"/><category scheme="http://www.blogger.com/atom/ns#" term="Книги"/><title type='text'>Руководство Microsoft® по проектированию архитектуры приложений</title><content type='html'>Доступно для загрузки второе издание &lt;a href=&quot;http://apparchguide.ms/Home/About&quot; target=&quot;_blank&quot;&gt;руководства по проектирования архитектуры приложений&lt;/a&gt; от команды &lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/practices/default.aspx&quot; target=&quot;_blank&quot;&gt;patterns &amp;amp; practices&lt;/a&gt;: &lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;div align=&quot;justify&quot;&gt;В руководстве предлагается обзор основных принципов и шаблонов, которые обеспечивают прочную базу для создания хорошей архитектуры и дизайна приложения. В дополнение к этой базе даются общеприменимые рекомендации по разделению функциональности приложения на слои, компоненты и сервисы. Далее приводятся советы по определению и реализации ключевых характеристик дизайна, основных атрибутов качества (таких как производительность, безопасность и масштабируемость) и сквозной функциональности (такой как кэширование и протоколирование). В завершение руководство предлагает рекомендации по архитектуре и дизайну наиболее общих типов приложений, таких как Веб-приложения, насыщенные Интернет-приложения (RIA), насыщенные клиентские приложения, сервисы и мобильные приложения.&lt;/div&gt;&lt;/blockquote&gt;&lt;div align=&quot;justify&quot;&gt;Для скачивания книги, придется зарегистрироваться на &lt;a href=&quot;http://apparchguide.ms/&quot; target=&quot;_blank&quot;&gt;основном сайте проекта&lt;/a&gt;.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/1884762225152119710/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/1884762225152119710' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1884762225152119710'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1884762225152119710'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/microsoft.html' title='Руководство Microsoft® по проектированию архитектуры приложений'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-4948979804356932518</id><published>2010-04-15T13:47:00.002+04:00</published><updated>2010-04-15T13:49:02.291+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="PowerThreading"/><title type='text'>AsyncEnumerator Usage Survey for Microsoft&#39;s .NET Team</title><content type='html'>&lt;a href=&quot;http://www.wintellect.com/CS/blogs/jeffreyr/default.aspx&quot; target=&quot;_blank&quot;&gt;Jeffrey Richter&lt;/a&gt; пытается договориться с Microsoft о добавлении его класса &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/magazine/cc546608.aspx&quot; target=&quot;_blank&quot;&gt;AsyncEnumerator&lt;/a&gt; (дополнительно можно почитать &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/magazine/cc721613.aspx&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;) или чего-то подобного в одну из будущих версий .NET Framework. Сам класс содержится в его библиотеке &lt;a href=&quot;http://www.wintellect.com/PowerThreading.aspx&quot; target=&quot;_blank&quot;&gt;Power Threading Library &lt;/a&gt;(PowerThreading), упрощающей многопоточное и асинхронное программирование.&lt;br /&gt;
&lt;br /&gt;
Команде Microsoft требуется дополнительная информация, для этого пройдите &lt;a href=&quot;http://www.surveymonkey.com/s/FTZPD8Y&quot; target=&quot;_blank&quot;&gt;опрос&lt;/a&gt; всего из трех вопросов.&lt;br /&gt;
&lt;br /&gt;
Ниже &lt;a href=&quot;http://tech.groups.yahoo.com/group/PowerThreading/message/725&quot; target=&quot;_blank&quot;&gt;исходный текст&lt;/a&gt; обращения.&lt;br /&gt;
&lt;br /&gt;
I have been working with Microsoft in an attempt to add my AsyncEnumerator (or something like it) into a future version of the .NET Framework.&lt;br /&gt;
&lt;br /&gt;
The good folks at Microsoft would like to gather some more information of how all of you actually use the AsyncEnumerator in your own projects.&lt;br /&gt;
&lt;br /&gt;
To that end, I have created a short, 3 question survey which I would like as many of you to answer as possible.&lt;br /&gt;
&lt;br /&gt;
Please take a few minutes out of your day and go here: &lt;a href=&quot;http://www.surveymonkey.com/s/FTZPD8Y&quot;&gt;http://www.surveymonkey.com/s/FTZPD8Y&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Please give as much information as you can and feel comfortable with. The more information we get, the better MS and I can accommodate your asynchronous programming needs in a future version of the .NET Framework.&lt;br /&gt;
&lt;br /&gt;
MS (and I) would also love to see some actual code that leverages the AsyncEnumerator. If you feel comfortable sharing some of your source code, please ZIP it up and e-mail it to me directly at this e-mail address: JeffreyR at Wintellect dot com. Please put “AsyncEnumerator Sample Code” in the subject line and do not expect a reply from me. MS and I will review this code in the next couple of weeks to help make decisions for a future version of the .NET Framework.&lt;br /&gt;
&lt;a href=&quot;http://www.surveymonkey.com/s/FTZPD8Y&quot;&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/4948979804356932518/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/4948979804356932518' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/4948979804356932518'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/4948979804356932518'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/asyncenumerator-usage-survey-for.html' title='AsyncEnumerator Usage Survey for Microsoft&#39;s .NET Team'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-5564685726166755943</id><published>2010-04-14T04:10:00.003+04:00</published><updated>2010-04-14T07:42:30.495+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="SOSEX"/><category scheme="http://www.blogger.com/atom/ns#" term="WinDbg"/><title type='text'>Доступна новая версия SOSEX 4</title><content type='html'>&lt;span xmlns=&quot;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=&quot;&quot;&gt;&lt;a href=&quot;http://www.stevestechspot.com/&quot;&gt;Steve Johnson&lt;/a&gt; выпустил версию &lt;a href=&quot;http://www.stevestechspot.com/SOSEXV40NowAvailable.aspx&quot;&gt;SOSEX 4&lt;/a&gt; (великолепное расширение &lt;a href=&quot;http://www.microsoft.com/whdc/devtools/debugging/default.mspx&quot;&gt;WinDbg&lt;/a&gt; для отладки Managed кода), совместимую с .NET 4.0 с существенными улучшениями функциональности.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span xmlns=&quot;&quot;&gt;Для начального знакомства с ним можно почитать несколько довольно старых статей: &lt;a href=&quot;http://www.stevestechspot.com/SOSEXANewDebuggingExtensionForManagedCode.aspx&quot;&gt;SOSEX - A New Debugging Extension for Managed Code&lt;/a&gt;, &lt;a href=&quot;http://www.wintellect.com/cs/blogs/jrobbins/archive/2007/06/19/great-sosex-a-phenomenal-net-debugging-extension-to-see-the-hard-stuff-steve-johnson-is-my-hero.aspx&quot;&gt;Great SOSEX! A Phenomenal .NET Debugging Extension to See the Hard Stuff&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=&quot;&quot;&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/5564685726166755943/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/5564685726166755943' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/5564685726166755943'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/5564685726166755943'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2010/04/sosex-4.html' title='Доступна новая версия SOSEX 4'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-2985911319992557251</id><published>2007-04-03T12:28:00.001+04:00</published><updated>2007-04-03T12:28:24.662+04:00</updated><title type='text'>.netTiers Application Framework</title><content type='html'>&lt;p&gt;&lt;a title=&quot;.netTiers Application Framework&quot; href=&quot;http://www.nettiers.com/&quot; target=&quot;_blank&quot;&gt;.netTiers&lt;/a&gt; - это&amp;nbsp;открытый (open source) бесплатный набор шаблонов для ORM (Object-Relational Mapping), берущий за основу существующую БД SQLServer и автоматически генерирующий персонализированные слои данных приложения (Data Tiers application block) для использования в .NET приложениях.&amp;nbsp;Проект также можно &lt;a title=&quot;netTiers are templates for object-relational mapping that takes an existing SQLServer database and automatically generates a personnalized Data Tiers application block to use in your .Net applications. (engine: codesmith or SmartCodeGenerator)&quot; href=&quot;http://sourceforge.net/projects/nettiers/&quot;&gt;найти&lt;/a&gt; на &lt;a title=&quot;SourceForge.net Create, Participate, Evaluate&quot; href=&quot;http://sourceforge.net/&quot; target=&quot;_blank&quot;&gt;SourceForge.net&lt;/a&gt;, на SF его поддерживает один из авторов &lt;span class=&quot;content&quot;&gt;John Roland.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;content&quot;&gt;Для получения приемлемых результатов при применении O/RM технологий критически важно грамотно спроектировать модель БД, .netTiers не исключение из этого правила. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;content&quot;&gt;.netTiers генерирует&amp;nbsp;код&amp;nbsp;непосредственно по модели БД без использования вспомогательного XML (или иного) уровня представления. Поэтому использование написанной на &quot;скорую руку&quot; модели, с плохим выбором primary / foreign ключей и т.п. код получится таким же неудачным, так что перед первым использованием .netTiers, даже если это&amp;nbsp;тестовая БД, проверьте еще раз, что она нормализирована и ключи определены верно и, по возможности, добавьте еще несколько не-ключевых полей, которые будут в дальнейшем использованы как фильтры.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;content&quot;&gt;Пропустить индексы в своей пробной БД модели достаточно просто, так как обычно выполняется предварительная оценка запросов и, затем уже определяются действительно необходимые индексы. .netTiers по индексам определяет, какие из столбцов должны иметь собственные методы для получения значений (и соответствующую автоматически генерируемую хранимую процедуру для обработки этих запросов). Если не определить индексов, то получение значений придется делать с помощью более общего запроса, с указанием критериев поиска, что скажется на быстродействии и удобстве.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;.netTiers построен на основе платного генератора кода &lt;a title=&quot;CodeSmith is a template-based code generator that allows you to generate code for any text language. The code generated can be customized by the use of properties. A property can be any .NET object that has a designer (most built in .NET types have designers already) and can be as simple as a boolean property that allows you to conditionally add or remove code from the result, to an object such as the TableSchema object (included in SchemaExplorer) which provides access to everything you could possibly want to know about a database table.  CodeSmith comes with many standard property types and is 100% extensible by allowing the user to create custom property types.&quot; href=&quot;http://codesmithtools.com/&quot; target=&quot;_blank&quot;&gt;CodeSmith Tools&lt;/a&gt;, но &lt;a href=&quot;http://sourceforge.net/forum/forum.php?forum_id=655218&quot;&gt;выполняется&lt;/a&gt; (в январе&amp;nbsp;было заключено соглашение) адаптация под бесплатный &lt;span id=&quot;ctl00_ctl00_ctl00_Content_ProjectBaseMain_ProjectMain_wikiSourceLabel&quot;&gt;&lt;a title=&quot;Smart Code Generator is 100% ASP.NET based codegeneration framework with intellisense, compilation, debug, sourceview and designview support powered by Visual Studio 2005.&quot; href=&quot;http://www.codeplex.com/smartcodegenerator&quot; target=&quot;_blank&quot;&gt;Smart Code Generator&lt;/a&gt;. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;В данный момент для работы потребуется:&lt;/span&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span&gt;Visual Studio 2005&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span&gt;Codesmith 3.x+&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span&gt;Microsoft SQL Server 2000+ (с ограничениями поддерживаются и другие БД)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span&gt;Microsoft .NET 2.0&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;span&gt;Рекомендуются так же:&lt;/span&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span&gt;&lt;a title=&quot;This page provides an overview of Enterprise Library for .NET Framework 2.0. The patterns &amp;amp; practices Enterprise Library is a library of application blocks designed to assist developers with common enterprise development challenges. Application blocks are a type of guidance, provided as source code that can be used &amp;quot;as is,&amp;quot; extended, or modified by developers to use on enterprise development projects. This release of Enterprise Library provides similar functionality to the previous releases for the .NET Framework 1.1; however, Enterprise Library has been redesigned to use the new capabilities of the .NET Framework 2.0.&quot; href=&quot;http://msdn.microsoft.com/library/?url=/library/en-us/dnpag2/html/EntLib2.asp&quot; target=&quot;_blank&quot;&gt;Microsoft Enterprise Library 2.0&lt;/a&gt; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span&gt;&lt;span class=&quot;content&quot;&gt;&lt;a title=&quot;NUnit is a unit-testing framework for all .Net languages. Initially ported from  JUnit, the current production release, version 2.4, is the fifth major release of this xUnit based unit testing tool for Microsoft .NET. It is written entirely in C# and has been completely redesigned to take advantage of many .NET language features, for example custom attributes and other reflection related capabilities. NUnit brings xUnit to all .NET languages&quot; href=&quot;http://www.nunit.org/&quot; target=&quot;_blank&quot;&gt;nUnit&lt;/a&gt;&amp;nbsp;или Visual Studio Team System&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;span&gt;&lt;span class=&quot;content&quot;&gt;Скачать последнюю версию можно &lt;a title=&quot;Current .netTiers Version&quot; href=&quot;http://www.nettiers.com/Download.aspx&quot;&gt;отсюда&lt;/a&gt;, там же есть доступ к SVN-репозитарию с текущими исходными кодами.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;&lt;span class=&quot;content&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;content&quot;&gt;На &lt;a title=&quot;Russian Software Developer Network&quot; href=&quot;http://www.rsdn.ru/&quot; target=&quot;_blank&quot;&gt;RSDN&lt;/a&gt; есть &lt;a title=&quot;CodeSmith ORM Mapping Templates (.NetTiers)&quot; href=&quot;http://www.rsdn.ru/Forum/Message.aspx?mid=1134797&amp;amp;all=1&quot; target=&quot;_blank&quot;&gt;тема&lt;/a&gt; в средствах разработки, посвященная в том числе и .netTiers.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;&lt;span class=&quot;content&quot;&gt;Интересующиеся технологиями O/R mapping могут&amp;nbsp;посмотреть на подобные бесплатные open source генераторы: &lt;a title=&quot;Based on Microsoft&#39;s Enterprise Library and MyGeneration&#39;s dOOdads, EasyObjects.NET is an Object/Relational Mapper (O/RM) data architecture written entirely in C#. It&#39;s real time saver for software developers. Imagine decreasing your development time by over 50%! Using your existing database schema, EasyObjects.NET combined with MyGeneration can generate a complete data-access layer and business logic layer for you in C# or VB.NET in a matter of seconds.&quot; href=&quot;http://www.easyobjects.net/&quot; target=&quot;_blank&quot;&gt;EasyObjects.NET&lt;/a&gt;&amp;nbsp;(еще один OR/M для Microsoft Enterprise Library) и &lt;a title=&quot;MyGeneration - Code Generation, O/R Mapping, and Architectures&quot; href=&quot;http://www.mygenerationsoftware.com/portal/default.aspx&quot; target=&quot;_blank&quot;&gt;MyGeneration&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;&lt;span class=&quot;content&quot;&gt;&lt;/span&gt;&lt;/span&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:2acba78c-8f44-4287-963c-cbf744e7aa94&quot; contenteditable=&quot;false&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;Blogus tags: &lt;a href=&quot;http://blogus.ru/tags/?.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;, &lt;a href=&quot;http://blogus.ru/tags/?nettiers&quot; rel=&quot;tag&quot;&gt;nettiers&lt;/a&gt;, &lt;a href=&quot;http://blogus.ru/tags/?code%20generation&quot; rel=&quot;tag&quot;&gt;code generation&lt;/a&gt;&lt;/div&gt;&lt;br&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:6c944ebe-791d-4e0e-a9d4-eb4df3f7584f&quot; contenteditable=&quot;false&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tags/nettiers&quot; rel=&quot;tag&quot;&gt;nettiers&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tags/code%20generation&quot; rel=&quot;tag&quot;&gt;code generation&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/2985911319992557251/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/2985911319992557251' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/2985911319992557251'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/2985911319992557251'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2007/04/nettiers-application-framework.html' title='.netTiers Application Framework'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-2504802419756908950</id><published>2007-02-17T20:38:00.001+03:00</published><updated>2007-02-17T20:39:25.597+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><title type='text'>Все о PInvoke</title><content type='html'>&lt;p&gt;Недавно набрел на замечательный &lt;a title=&quot;Platform Invoke Cheat Sheet&quot; href=&quot;http://www.gotdotnet.com/team/clr/bcl/TechArticles/TechArticles/PInvokeHelp/FAQ.aspx&quot; target=&quot;_blank&quot;&gt;FAQ&lt;/a&gt; от &lt;a title=&quot;.NET framework community website&quot; href=&quot;http://www.gotdotnet.com/&quot; target=&quot;_blank&quot;&gt;GotDotNet&lt;/a&gt;, посвященный &lt;a title=&quot;Platform Invocation Services (PInvoke) allows managed code to call unmanaged functions that are implemented in a DLL.&quot; href=&quot;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkPlatformInvokeTutorial.asp&quot;&gt;Platform Invoke&lt;/a&gt; (PInvoke): возможности вызова unmanaged (native) кода, например, Win32, из приложений .NET. В FAQ много полезной информации.&lt;/p&gt; &lt;p&gt;При использовании PInvoke частенько возникают проблемы, в том числе, не последняя - отсутствие прототипов Win32 API функций в пригодном для вставке в .NET виде. Я использую &lt;a title=&quot;PINVOKE.NET attempts to address the difficulty of calling Win32 or other unmanaged APIs in managed code (languages such as C# and VB .NET). Manually defining and using PInvoke signatures (also known as Declare statements in VB) is an error-prone process that can introduce extremely subtle bugs. The rules are complex, and if you make a mistake, you’ll probably corrupt memory&quot; href=&quot;http://www.pinvoke.net/&quot;&gt;PInvoke.Net&lt;/a&gt;, также можно воспользоваться &lt;a title=&quot;When a Win32 API is not exposed by the .NET framework you must manually write an interop wrapper to access that API. Writing these wrappers is difficult and error prone. This post includes C# definitions of many common Win32APIs and their related data structures. It does not include all Win32 APIs and it is missing all #define constants. It was created by a rather complex semi-automatic process. If I get enough requests I will release the source for the process used to create this file.&quot; href=&quot;http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=f1dd70e4-c212-4a6f-bff7-c82e34c8836f&quot;&gt;Interop Declarations for Windows.h&lt;/a&gt; Несложно и самому по прототипу составить соответствующее описание, но удобнее и быстрее воспользоваться готовым.&lt;/p&gt; &lt;p&gt;Пригодится так же &lt;a title=&quot;This article identifies the Microsoft .NET Framework version 1.0 or 1.1 APIs that provide similar functionality to Microsoft Win32 functions. One or more relevant .NET Framework APIs are shown for each Win32 function listed. The intended audience for this article is experienced Win32 developers who are creating applications or libraries based on the Microsoft .NET Framework, but anyone looking for a managed counterpart for a Win32 function could find this document useful.&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/aa302340.aspx&quot;&gt;Microsoft Win32 to Microsoft .NET Framework API Map&lt;/a&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:8e2b2054-f5a6-407a-9582-fb47336d3dd3&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:9ba73a87-fcd8-4edd-a667-bca6fdbba296&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Blogus tags: &lt;a href=&quot;http://blogus.ru/tags/?.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/2504802419756908950/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/2504802419756908950' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/2504802419756908950'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/2504802419756908950'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2007/02/pinvoke.html' title='Все о PInvoke'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-3974799133057619866</id><published>2007-02-17T19:05:00.001+03:00</published><updated>2007-02-17T19:11:03.567+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Возможности расширения приложений .NET</title><content type='html'>&lt;p&gt; &lt;/p&gt; &lt;p&gt;Уже довольно давно не обновлял свой блог: навалилось много работы, домашние дела и вообще много всего. Постараюсь исправиться :)&lt;/p&gt; &lt;p&gt;Microsoft решила более-менее стандартизировать подход к расширению приложений за счет разнообразных плагинов:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Microsoft .NET Framework сильно облегчает встраивание в собственные приложения компонентов, созданных другими разработчиками. Однако это просто, только если известно, к каким компонентам выполняется привязка. Если в момент сборки такие компоненты не известны, что типично для надстроек, то все становится намного сложнее. При расширении своих приложений у разработчиков часто возникают вопросы. Например, надстройки следует хранить в базе данных или на диске? Следует ли в надстройке использовать известный интерфейс или запрашивать тип для активации? Каков наилучший способ использования AppDomain, AppDomainManager и AppDomainSetup?&lt;/p&gt; &lt;p&gt;Эти и другие вопросы решаются в двух выпусках внутреннего бюллетеня CLR за счет введения в библиотеку базовых классов нового пространства имен System.AddIn, которое будет доступно в следующем выпуске Visual Studio&lt;sup&gt;®&lt;/sup&gt; (с кодовым именем &quot;Orcas&quot;). &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Подробнее об этом можно узнать на русском языке, прочитав &lt;a title=&quot;Возможность расширения приложений .NET&quot; href=&quot;http://msdn.microsoft.com/msdnmag/issues/07/02/CLRInsideOut/Default.aspx?loc=ru&quot; target=&quot;_blank&quot;&gt;статью из февральского номера CLR Inside Out&lt;/a&gt; и ее продолжение &lt;a title=&quot;В первой статье, где было представлено новое пространство имен System.AddIn в библиотеках базовых классов (BCL), мы рассмотрели типовой подход, применяемый клиентами для обеспечения расширяемости главных приложений.&quot; href=&quot;http://msdn.microsoft.com/msdnmag/issues/07/03/CLRInsideOut/default.aspx?loc=ru&quot; target=&quot;_blank&quot;&gt;Расширяемость приложений .NET, часть 2&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Этому же посвящен блог разработчиков: &lt;a href=&quot;http://blogs.msdn.com/clraddins/&quot; target=&quot;_blank&quot;&gt;CLR Add-In Team Blog&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;В блоге &lt;a title=&quot;From the last blog post, we understand that we need new contract at the isolation boundary to route AddIn calls to and from the Host. We defined 3 new contracts IAddInRenderArgsContract IAddInSurfaceContract and IAddInColorBgraContract. As we discussed before, AddIn cannot take dependence on the Contract either. We still cannot route calls from AddIn side to the Host side. In our model, we use views and adapters to solver the problem.&quot; href=&quot;http://blogs.msdn.com/zifengh/&quot;&gt;Jason He&#39;s WebLog&lt;/a&gt; рассматривается реализация данной модели для  Paint.Net. Может быть интересен и блог одного из авторов: &lt;a title=&quot;My blog has a number of related topics spanning the following subjects; CLR, Smart Clients, VSTO, VSTA, VS SDK, and Managed Add-in&#39;s (isolation, versioning, etc..).  In some respects my blog follows my Microsoft job responsibilities over the last few years.  The over arching common theme of my posts is to share my learning&#39;s on .Net in the hopes of helping developers, ISV&#39;s, architects, and solution providers.  Given my new responsibilities for supporting the ISV community from within the CLR team, you may expect more posts on aiding this customer segment.  And given our recent announcements on System.AddIn*, you will also see more posts on this subject.&quot; href=&quot;http://blogs.msdn.com/jackg/&quot;&gt;Jack Gudenkauf (JackG) WebLog&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Новые библиотеки доступны в январском &lt;a title=&quot;Microsoft Visual Studio Code Name &amp;quot;Orcas&amp;quot; is the next generation development tool for Windows Vista, the 2007 Office System, and the Web.&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyId=69055927-458B-4129-9047-FCC4FACAE96C&amp;displaylang=en&quot;&gt;CTP Visual Studio&lt;/a&gt; &lt;/p&gt;
&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:931b78a5-1486-40a1-94f2-a3a3bd4a3104&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tags/Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:f8b80962-1bf9-43bf-bdec-c0bb91d0f33d&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;Blogus tags: &lt;a href=&quot;http://blogus.ru/tags/?.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;, &lt;a href=&quot;http://blogus.ru/tags/?Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/3974799133057619866/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/3974799133057619866' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3974799133057619866'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3974799133057619866'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2007/02/net.html' title='Возможности расширения приложений .NET'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-3416521403084606564</id><published>2007-01-02T14:45:00.001+03:00</published><updated>2007-01-02T14:46:53.698+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Tweak&amp;#39;и для Visual Studio 2005 SP1</title><content type='html'>&lt;p&gt;&lt;a title=&quot;Вышел релиз первого сервис пака для Visual Studio&quot; href=&quot;http://nsentinel.blogspot.com/2006/12/visual-studio-service-pack-1-sp1.html&quot;&gt;Выпущенный&lt;/a&gt; недавно Service Pack (SP) для Visual Studio требует для установки очень много &lt;a title=&quot;VS 2005 SP1 Takes a While to Install&quot; href=&quot;http://blogs.msdn.com/heaths/archive/2006/10/06/VS-2005-SP1-Takes-a-While-to-Install.aspx&quot; target=&quot;_blank&quot;&gt;времени&lt;/a&gt; и &lt;a title=&quot;VS 2005 SP1 Requires a lot of Disk Space&quot; href=&quot;http://blogs.msdn.com/heaths/archive/2006/10/06/VS-2005-SP1-Requires-a-lot-of-Disk-Space.aspx&quot; target=&quot;_blank&quot;&gt;свободного дискового пространства&lt;/a&gt;. Однако, эту ситуацию можно улучшить. &lt;/p&gt; &lt;p&gt;Для установки создайте и выполните командный файл:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;reg export HKLM\Software\Policies\Microsoft\Windows\Installer installer.reg
reg add HKLM\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /t REG_DWORD /d 0 /f
net stop msiserver
start /wait VS80-KB&lt;em&gt;nnnnnn&lt;/em&gt;-X86-&lt;em&gt;mmm&lt;/em&gt;.exe
reg delete HKLM\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /f
reg import installer.reg
net stop msiserver
del /q installer.reg 2&amp;gt;nul&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Здесь VS80-KB&lt;em&gt;nnnnnn&lt;/em&gt;-X86-&lt;em&gt;mmm&lt;/em&gt;.exe - имя файла с Service Pack&#39;ом.&lt;/p&gt; &lt;p&gt;Подробнее можно почитать в блоге у автора метода: &lt;a title=&quot;The upcoming Visual Studio 2005 Service Pack 1 can take a while to install and can require a lot of disk installed, and even more disk space while installing the patch. You can save a little of both by disabling the Windows Installer patch caching feature.&quot; href=&quot;http://blogs.msdn.com/heaths/archive/2006/11/28/save-time-and-space-for-vs-2005-sp1-by-disabling-the-patch-cache.aspx&quot; target=&quot;_blank&quot;&gt;Save Time and Space for VS 2005 SP1 by Disabling the Patch Cache&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Там же доступна информация о встраивании SP в инсталляционный пакет: &lt;a title=&quot;Now that Visual Studio 2005 Service Pack 1 is released, some are wondering how to slipstream the patch so they can install Visual Studio 2005 with SP1 already applied&quot; href=&quot;http://blogs.msdn.com/heaths/archive/2006/12/16/slipstreaming-visual-studio-2005-service-pack-1.aspx&quot; target=&quot;_blank&quot;&gt;Slipstreaming Visual Studio 2005 Service Pack 1&lt;/a&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:43847ed2-9198-40d5-a7df-47137b660d0c&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;&lt;/div&gt;
Blogus tags : &lt;a href=&quot;http://blogus.ru/tags/?Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/3416521403084606564/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/3416521403084606564' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3416521403084606564'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3416521403084606564'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2007/01/tweak-visual-studio-2005-sp1.html' title='Tweak&amp;#39;и для Visual Studio 2005 SP1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-3105191208722035838</id><published>2007-01-01T19:14:00.001+03:00</published><updated>2007-01-01T19:20:15.438+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Other"/><title type='text'>С Новым 2007 годом!</title><content type='html'>&lt;p&gt;Поздравляю всех с наступившим 2007 годом!&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Дружбы, радости и смеха,
Новых знаний, сил, успеха,
Жизни в счастье и в ладу,
Я Вам искренне желаю
В наступающем году!&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Всего самого наилучшего!&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;З.Ы. У меня конец года выдался крайне насыщенным, настолько, что времени на ведение блога не было совсем. Сейчас, наконец, всё пришло в норму, и я смогу продолжить свои заметки.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/3105191208722035838/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/3105191208722035838' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3105191208722035838'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3105191208722035838'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2007/01/2007.html' title='С Новым 2007 годом!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-7276198793714045466</id><published>2006-12-19T06:49:00.001+03:00</published><updated>2006-12-19T06:49:42.279+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="Книги"/><title type='text'>Professional C#/VB .NET Coding Guidelines</title><content type='html'>&lt;p&gt;Компания &lt;a title=&quot;Our Products&quot; href=&quot;http://submain.com/?nav=&quot; target=&quot;_blank&quot;&gt;SubMain&lt;/a&gt; выложила в свободный доступ книгу &quot;&lt;a title=&quot;.NET Coding Guidelines is a 100+ page ebook (PDF) on naming conventions, best coding practices and patterns written by the industry expert Steven Sartain and delivered to you for Free by SubMain.&quot; href=&quot;http://submain.com/?nav=products.guidelines&quot; target=&quot;_blank&quot;&gt;Professional C#/VB .NET Coding Guidelines&lt;/a&gt;&quot;, посвященную вопросам соглашения имен, проверенным практикам кодирования и паттернам.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Книга содержит информацию по следующим темам:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Naming Guidelines &lt;/li&gt; &lt;li&gt;Class Member Usage Guidelines &lt;img src=&quot;http://submain.com/images/guidelines/guidelines_title_150x211.gif&quot; align=&quot;right&quot; /&gt;&lt;/li&gt; &lt;li&gt;Guidelines for Exposing Functionality to COM &lt;/li&gt; &lt;li&gt;Error Raising &amp; Handling Guidelines &lt;/li&gt; &lt;li&gt;Array Usage Guidelines &lt;/li&gt; &lt;li&gt;Operator Overloading Usage Guidelines &lt;/li&gt; &lt;li&gt;Guidelines for Casting Types &lt;/li&gt; &lt;li&gt;Common Design Patterns &lt;/li&gt; &lt;li&gt;Callback Function Usage &lt;/li&gt; &lt;li&gt;Time-Out Usage &lt;/li&gt; &lt;li&gt;Security in Class Libraries &lt;/li&gt; &lt;li&gt;Threading Design Guidelines &lt;/li&gt; &lt;li&gt;Formatting Standards &lt;/li&gt; &lt;li&gt;Commenting Code &lt;/li&gt; &lt;li&gt;Code Reviews &lt;/li&gt; &lt;li&gt;Additional Notes for VB .NET Developers &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a title=&quot;Download Center&quot; href=&quot;http://submain.com/download.aspx?product=guidelines&quot; target=&quot;_blank&quot;&gt;Прямая ссылка&lt;/a&gt; на книгу. Перед скачиванием необходимо будет указать произвольный e-mail.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Там же на сайте обнаружил удобный бесплатный плагин для Visual Studio: &lt;a title=&quot;SmartOutline is a utility that enables enhanced region outlining. SmartOutline regions are supported with any VS2005 programming language and file type that can be opened in the Visual Studio editor&quot; href=&quot;http://submain.com/?nav=products.smartoutline&quot; target=&quot;_blank&quot;&gt;SmartOutline for VS2005&lt;/a&gt;, облегчающий работу с регионами.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Easy way to create, edit and remove custom regions - even those that are not possible with the VS built-in tools  &lt;/li&gt;&lt;li&gt;Works in any Visual Studio code editor, including custom editors  &lt;/li&gt;&lt;li&gt;Works in conjunction with the auto outlining feature of the code editors such as those for &lt;b&gt;VB.NET&lt;/b&gt;, &lt;b&gt;C#&lt;/b&gt; etc  &lt;/li&gt;&lt;li&gt;Persists/saves state (region name, collapsed/expanded) of regions between Visual Studio sessions &lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:36be1b70-cd7e-46c1-9a4d-2655efe0f111&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tags/%d0%9a%d0%bd%d0%b8%d0%b3%d0%b8&quot; rel=&quot;tag&quot;&gt;Книги&lt;/a&gt;&lt;/div&gt;
Blogus tags : &lt;a href=&quot;http://blogus.ru/tags/?Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;, &lt;a href=&quot;http://blogus.ru/tags/?%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8&quot; rel=&quot;tag&quot;&gt;Книги&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/7276198793714045466/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/7276198793714045466' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/7276198793714045466'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/7276198793714045466'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/professional-cvb-net-coding-guidelines.html' title='Professional C#/VB .NET Coding Guidelines'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-994410025156271511</id><published>2006-12-15T18:58:00.001+03:00</published><updated>2006-12-15T19:02:40.902+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Visual Studio Service Pack 1 (SP1)</title><content type='html'>&lt;p&gt;Вышел релиз первого сервис пака для Visual Studio.&lt;/p&gt; &lt;p&gt;Подробнее: &lt;a title=&quot;Visual Studio 2005 Service Pack 1 continues Microsoft’s investment in market leading development tools&quot; href=&quot;http://msdn.microsoft.com/vstudio/support/vs2005sp1/default.aspx&quot; target=&quot;_blank&quot;&gt;Visual Studio 2005 Service Pack 1 (SP1)&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Through further advancement and feedback, Service Pack 1 also provides over 70 improvements for common development scenarios including:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;New processor support (e.g., Core Duo) for code generation and profiling  &lt;/li&gt;&lt;li&gt;Performance and scale improvements in Team Foundation Server  &lt;/li&gt;&lt;li&gt;Team Foundation Server integration with Excel 2007 and Project 2007  &lt;/li&gt;&lt;li&gt;Tool support for occasionally connected devices and SQL Server Compact Edition  &lt;/li&gt;&lt;li&gt;Additional support for project file based Web applications  &lt;/li&gt;&lt;li&gt;Windows Embedded 6.0 platform and tools support &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:05247d05-aa17-457d-a58f-c72591fb55b7&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;&lt;/div&gt;
Blogus tags : &lt;a href=&quot;http://blogus.ru/tags/?Visual%20Studio&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/994410025156271511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/994410025156271511' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/994410025156271511'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/994410025156271511'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/visual-studio-service-pack-1-sp1.html' title='Visual Studio Service Pack 1 (SP1)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-3644839612656247122</id><published>2006-12-15T08:32:00.001+03:00</published><updated>2006-12-15T08:33:04.500+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Other"/><title type='text'>База переводов стандартных терминов от Microsoft</title><content type='html'>&lt;p&gt;Microsoft предоставила возможность всем желающим бесплатно &lt;a title=&quot;Microsoft terminology spreadsheet with translations for over 40 languages&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=25018024-2DFD-4229-9763-05F78FEAF2FF&amp;displaylang=en&quot;&gt;скачать&lt;/a&gt; базу переводов &lt;a title=&quot;Microsoft provides the Microsoft terminology data to allow our customers, ISVs, and partners to have a more consistent user experience across the products they are using and developing.&quot; href=&quot;http://www.microsoft.com/globaldev/tools/MILSGlossary.mspx&quot; target=&quot;_blank&quot;&gt;стандартных терминов&lt;/a&gt;, содержащую более 9000 определений, переведенных на 45 различных языков. Данные представлены в виде CSV-файла. &lt;/p&gt; &lt;p&gt;via &lt;a title=&quot;Очень часто администраторы и специалисты технической поддержки сталкиваются с необходимостью перевести сообщение об ошибке или элемент интерфейса обратно на английский язык, чтобы найти решение проблемы или информацию в базе знаний или в Интернете. С подобной же проблемой сталкиваются разработчики программного обеспечения, которые хотят локализовать свое приложение для рынков других стран, используя стандартные названия в пользовательском интерфейсе.&quot; href=&quot;http://blogs.technet.com/aram/archive/2006/12/14/556539.aspx&quot; target=&quot;_blank&quot;&gt;International Project Engineering изнутри&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/3644839612656247122/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/3644839612656247122' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3644839612656247122'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/3644839612656247122'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/microsoft.html' title='База переводов стандартных терминов от Microsoft'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-824361126599404285</id><published>2006-12-14T06:23:00.001+03:00</published><updated>2006-12-14T06:23:40.334+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Статьи"/><title type='text'>Подборка информации по управлению IT</title><content type='html'>&lt;p&gt;На сайте группы компаний &lt;a title=&quot;Технологии корпоративного развития&quot; href=&quot;http://www.tekora.ru/&quot; target=&quot;_blank&quot;&gt;Текора&lt;/a&gt;  опубликована &lt;a href=&quot;http://www.tekora.ru/default.asp?artID=82&quot; target=&quot;_blank&quot;&gt;подборка статей и презентаций&lt;/a&gt; по следующим темам:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Системы управления проектами в современных организациях&lt;/li&gt; &lt;li&gt;Бизнес кухня и IT кулинария&lt;/li&gt; &lt;li&gt;Менеджер проекта. Взгляд с позиции HR – менеджера&lt;/li&gt; &lt;li&gt;Проектно-ориентированное управление инвестициями и развитием бизнеса и др.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Похожая тематика от Microsoft: &lt;a title=&quot;Best practices and experiences from Microsoft IT that give a unique, inside view into how Microsoft plans for, deploys, and manages its own enterprise solutions.&quot; href=&quot;http://www.microsoft.com/technet/itshowcase/default.mspx&quot; target=&quot;_blank&quot;&gt;How Microsoft Does IT&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Рекомендую.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/824361126599404285/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/824361126599404285' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/824361126599404285'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/824361126599404285'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/it.html' title='Подборка информации по управлению IT'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-1835617564138214228</id><published>2006-12-14T05:59:00.001+03:00</published><updated>2006-12-14T06:00:13.735+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Статьи"/><title type='text'>CodeProject: Implementing IDisposable and the Dispose Pattern Properly</title><content type='html'>&lt;p&gt;Новая статья на CodeProject: &lt;a title=&quot;Explains how to properly implement the IDisposable interface, the Dispose pattern, and deterministic finalization.&quot; href=&quot;http://www.codeproject.com/useritems/idisposable.asp&quot; target=&quot;_blank&quot;&gt;Implementing IDisposable and the Dispose Pattern Properly&lt;/a&gt; , содержит подробный обзор проблемы корректного освобождения ресурсов в .NET с примерами реализации.&lt;/p&gt; &lt;p&gt;Ссылки по теме:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title=&quot;Earlier this week, I wrote an internal email explaining how Finalization works in V1 / V1.1, and how it has been changed for Whidbey&quot; href=&quot;http://blogs.msdn.com/cbrumme/archive/2004/02/20/77460.aspx&quot; target=&quot;_blank&quot;&gt;Finalization&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;Garbage collection in the Microsoft .NET common language runtime environment completely absolves the developer from tracking memory usage and knowing when to free memory&quot; href=&quot;http://msdn.microsoft.com/msdnmag/issues/1100/GCI/&quot; target=&quot;_blank&quot;&gt;Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework&lt;/a&gt; by Jeffrey Richter&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;The first part of this two-part article explained how the garbage collection algorithm works, how resources can clean up properly when the garbage collector decides to free a resource&#39;s memory, and how to force an object to clean up when it is freed&quot; href=&quot;http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/&quot; target=&quot;_blank&quot;&gt;Garbage Collection—Part 2: Automatic Memory Management in the Microsoft .NET Framework&lt;/a&gt; by Jeffrey Richter&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;Here it is: the revised “Dispose, Finalization, and Resource Management” Design Guideline entry&quot; href=&quot;http://www.bluebytesoftware.com/blog/PermaLink,guid,88e62cdf-5919-4ac7-bc33-20c06ae539ae.aspx&quot; target=&quot;_blank&quot;&gt;DG Update: Dispose, Finalization, and Resource Management&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Неплохая презентация: &lt;a href=&quot;http://www.dotsite.ru/lectures/dotnet_5.ppt&quot; target=&quot;_blank&quot;&gt;Механизм сборки мусора в .NET&lt;/a&gt;, жаль практически без комментариев.&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;Алгоритм сборки мусора, используемый в .NET&quot; href=&quot;http://www.rsdn.ru/article/dotnet/GC.xml&quot; target=&quot;_blank&quot;&gt;GC в .NET&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;как работает сборщик мусора и зачем придумана конструкция using, выясним, почему не стоит злоупотреблять деструкторами в C# и MC++, и какая разница между Finalize и Dispose&quot; href=&quot;http://www.rsdn.ru/article/dotnet/GCnet.xml&quot; target=&quot;_blank&quot;&gt;Автоматическое управление памятью в .NET&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Для понимания механизма работы сборщика мусора может быть полезна статья: &lt;a title=&quot;В данной статье мы рассмотрим обобщённую реализацию сборки мусора на С++. Будут обсуждены два конкретных алгоритма сборки мусора – “Mark-Sweep” и “Mark-Compact”, и их реализация&quot; href=&quot;http://www.rsdn.ru/article/cpp/GCcpp.xml&quot; target=&quot;_blank&quot;&gt;Реализация сборки мусора на С++&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:22b4adc6-871d-433b-9996-aa8562b9610b&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tags/%d1%81%d1%82%d0%b0%d1%82%d1%8c%d0%b8&quot; rel=&quot;tag&quot;&gt;статьи&lt;/a&gt;&lt;/div&gt;
Blogus tags : &lt;a href=&quot;http://blogus.ru/tags/?.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;,&lt;a href=&quot;http://blogus.ru/tags/?%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8&quot; rel=&quot;tag&quot;&gt;статьи&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/1835617564138214228/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/1835617564138214228' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1835617564138214228'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1835617564138214228'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/codeproject-implementing-idisposable.html' title='CodeProject: Implementing IDisposable and the Dispose Pattern Properly'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-1538993156878304356</id><published>2006-12-12T01:24:00.001+03:00</published><updated>2006-12-12T01:25:09.649+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Статьи"/><title type='text'>Новые статьи на CodeProject: Neural Networks, конфигурирование .NET 2.0</title><content type='html'>&lt;p&gt;На &lt;a title=&quot;The CodeProject - Free Source Code and Tutorials&quot; href=&quot;http://www.codeproject.com/&quot; target=&quot;_blank&quot;&gt;CodeProject&lt;/a&gt; появились две интересные (несвязанные между собой) серии статей:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;AI : Neural Network for beginners: &lt;a title=&quot;Introduction into Perceptron networks (single layer neural networks)&quot; href=&quot;http://www.codeproject.com/useritems/NeuralNetwork_1.asp&quot; target=&quot;_blank&quot;&gt;часть 1&lt;/a&gt;, &lt;a title=&quot;This one, is about multi layer neural networks, and the back propogation training method to solve a non linear classification problem such as the logic of an XOR logic gate&quot; href=&quot;http://www.codeproject.com/useritems/Backprop_ANN.asp&quot; target=&quot;_blank&quot;&gt;часть 2&lt;/a&gt;, &lt;a title=&quot;This one, is about how to use a genetic algorithm (GA) to train a multi layer neural network to solve some logic problem, if you have never come across genetic algorithms, perhaps my other article located here may be a good place to start to learn the basics&quot; href=&quot;http://www.codeproject.com/useritems/GA_ANN_XOR.asp&quot; target=&quot;_blank&quot;&gt;часть 3&lt;/a&gt;. Статьи посвящены нейронным сетям, теории и практической реализации алгоритмов обучения. Цикл отлично дополняют &lt;a title=&quot;The articles describes a C# library for neural network computations, and their application for several problem solving.&quot; href=&quot;http://www.codeproject.com/csharp/aforge_neuro.asp&quot; target=&quot;_blank&quot;&gt;Neural Networks on C#&lt;/a&gt; и статьи по генетическим алгоритмам: &lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title=&quot;A simple Genetic Algorithm (GA) to solve a card problem.&quot; href=&quot;http://www.codeproject.com/cs/algorithms/Genetic_Algorithm.asp&quot; target=&quot;_blank&quot;&gt;AI - Simple Genetic Algorithm (GA) to solve a card problem&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;Taking a simple genetic algorithm and constructing a framework to allow easy creation of similar algorithms.&quot; href=&quot;http://www.codeproject.com/useritems/GA_Generalization.asp&quot; target=&quot;_blank&quot;&gt;Generalization of a Simple Genetic Algorithm (GA)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;The articles describes a C# library for evolution computations and their application for several problems solving.&quot; href=&quot;http://www.codeproject.com/cs/algorithms/aforge_genetic.asp&quot; target=&quot;_blank&quot;&gt;Evolution computations on C#&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;In this article we shall produce a simple genetic algorithm in C#&quot; href=&quot;http://www.codeproject.com/cs/algorithms/btl_ga.asp&quot; target=&quot;_blank&quot;&gt;A Simple C# Genetic Algorithm&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;Introduction to genetic algorithms.&quot; href=&quot;http://www.codeproject.com/cs/algorithms/genetics_dot_net.asp&quot; target=&quot;_blank&quot;&gt;Genetics Dot Net - The Basics&lt;/a&gt; и &lt;a title=&quot;A Look at Adaptive programming with Genetic Algorithms&quot; href=&quot;http://www.codeproject.com/useritems/GenticsDevTwo.asp&quot;&gt;Genetics Dot Net Two - Adaptive Programming&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Две очень подробные статьи о конфигурировании приложений в .NET 2.0: &lt;a title=&quot;Learn how to utilize the powerful new .NET 2.0 configuration features to simplify and centralize your configuration code.&quot; href=&quot;http://www.codeproject.com/dotnet/mysteriesofconfiguration.asp&quot; target=&quot;_blank&quot;&gt;Unraveling the Mysteries of .NET 2.0 Configuration&lt;/a&gt; и &lt;a title=&quot;Continue delving into the mysteries of the powerful .NET 2.0 Configuration framework, and learn how to write validated, type-safe and performant configuration code&quot; href=&quot;http://www.codeproject.com/useritems/mysteriesofconfiguration2.asp&quot; target=&quot;_blank&quot;&gt;Decoding the Mysteries of .NET 2.0 Configuration&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:e5ab9729-829e-4142-b9b3-dd874eff73b8&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tags/%d0%a1%d1%82%d0%b0%d1%82%d1%8c%d0%b8&quot; rel=&quot;tag&quot;&gt;Статьи&lt;/a&gt;&lt;/div&gt;
Blogus tags : &lt;a href=&quot;http://blogus.ru/tags/?.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;,&lt;a href=&quot;http://blogus.ru/tags/?%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8&quot; rel=&quot;tag&quot;&gt;Статьи&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/1538993156878304356/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/1538993156878304356' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1538993156878304356'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1538993156878304356'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/codeproject-neural-networks-net-20.html' title='Новые статьи на CodeProject: Neural Networks, конфигурирование .NET 2.0'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-1545324042095156740</id><published>2006-12-11T05:13:00.001+03:00</published><updated>2006-12-11T06:21:05.278+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Алгоритмы"/><title type='text'>Generic Data Structures and Algorithms in .NET2.0</title><content type='html'>&lt;p&gt;На &lt;a title=&quot;Free Source Code and Tutorials&quot; href=&quot;http://www.codeproject.com/&quot; target=&quot;_blank&quot;&gt;CodeProject&lt;/a&gt; опубликована статья: &lt;a title=&quot;Implementations of generic data structures and algorithms in .NET 2.0.&quot; href=&quot;http://www.codeproject.com/cs/algorithms/DotNet2Datastructures.asp&quot; target=&quot;_blank&quot;&gt;Back to basics - Generic Data Structures and Algorithms In .NET 2.0&lt;/a&gt;, содержащая подборку различных алгоритмов и структур данных.&lt;/p&gt; &lt;p&gt;Реализовано и готово для повторного использования следующее:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;Association - класс, клонирующий функциональность  стандартного KeyValuePair&amp;lt;TKey, TValue&amp;gt;, но с возможностью раздельно устанавливать Key и Value&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;. &lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;Bag - структура данных для хранения произвольного количества элементов, подобна множеству, но допускающая одинаковые элементы. Реализована с помощью Dictionary&amp;lt;T, int&amp;gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;code&gt;.&lt;/code&gt; &lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;BinaryTree&amp;lt;T&amp;gt; - реализация&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt; &lt;/span&gt;&lt;a title=&quot;n computer science, a binary tree is a tree data structure in which each node has at most two children.&quot; href=&quot;http://en.wikipedia.org/wiki/Binary_Tree&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;двоичного дерева&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;.&lt;/span&gt;&lt;/code&gt;  &lt;/li&gt;&lt;li&gt;Deque&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; - &lt;/span&gt;&lt;a title=&quot;In computer science, a deque (short for double-ended queue) is a data structure for which elements can be added to or removed from the front or back.&quot; href=&quot;http://www.codeproject.com/cs/algorithms/DotNet2Datastructures.asp&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;двусвязная очередь&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;.&lt;/span&gt;&lt;/code&gt;  &lt;/li&gt;&lt;li&gt;GeneralTree&amp;lt;T&amp;gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; - &lt;/span&gt;&lt;a title=&quot;In computer science, a tree is a widely-used data structure that emulates a tree structure with a set of linked nodes&quot; href=&quot;http://en.wikipedia.org/wiki/Tree_data_structure&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;деревья&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;.&lt;/span&gt;&lt;/code&gt;  &lt;/li&gt;&lt;li&gt;Vertex&amp;lt;T&amp;gt;, Edge&amp;lt;T&amp;gt;, Graph&amp;lt;T&amp;gt; &lt;code&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;- &lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;классы для построения &lt;/span&gt;&lt;/span&gt;&lt;a title=&quot;In computer science, a graph is a kind of data structure, specifically an abstract data type (ADT), that consists of a set of nodes and a set of edges that establish relationships (connections) between the nodes&quot; href=&quot;http://en.wikipedia.org/wiki/Graph_%28data_structure%29&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;графов&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;  &lt;/li&gt;&lt;li&gt;Heap &lt;code&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;- &lt;/span&gt;&lt;a title=&quot;In computer science, a heap is a specialized tree-based data structure that satisfies the heap property&quot; href=&quot;http://en.wikipedia.org/wiki/Heap_%28data_structure%29&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;куча&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;  &lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;Matrix - реализация&lt;code&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt; &lt;/span&gt;&lt;a title=&quot;In mathematics, a matrix (plural matrices) is a rectangular table of numbers or, more generally, a table consisting of abstract quantities that can be added and multiplied&quot; href=&quot;http://en.wikipedia.org/wiki/Matrix_%28mathematics%29&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;матриц&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;с поддержкой операций.  &lt;/li&gt;&lt;li&gt;PascalSet - реализация&lt;code&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt; &lt;/span&gt;&lt;a title=&quot;In computer science, a set is a collection (container) of certain values without any particular order, and no repeated values&quot; href=&quot;http://en.wikipedia.org/wiki/Set_%28computer_science%29&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;математического множества&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;с операциями&lt;/span&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;  &lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;PriorityQueue&amp;lt;T&amp;gt; &lt;/span&gt;&lt;/span&gt;- &lt;a title=&quot;A priority queue is an abstract data type supporting the following three operations&quot; href=&quot;http://en.wikipedia.org/wiki/Priority_queues&quot; target=&quot;_blank&quot;&gt;приоритетная очередь&lt;/a&gt;.  &lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;SortedList&amp;lt;T&amp;gt; - аналог SortedList&amp;lt;TKey, TValue&amp;gt;, за исключением:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;поддерживается хранение повторяющихся элементов (оригинальный не позволяет);&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;элементы сортируются по собственному значению, не требуя ключа.&lt;span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;VisitableHashtable&amp;lt;Tkey, TValue&amp;gt;, VisitableLinkedList&amp;lt;T&amp;gt;, VisitableList&amp;lt;T&amp;gt;, VisitableQueue&amp;lt;T&amp;gt;, VisitableStack&amp;lt;T&amp;gt; - различные реализации интерфейса IVisitableCollection&amp;lt;T&amp;gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt; &lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;Реализованы паттерны:&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;/span&gt;&lt;a title=&quot;In software engineering, the singleton design pattern is used to restrict instantiation of a class to one object&quot; href=&quot;http://en.wikipedia.org/wiki/Singleton_pattern&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;Singleton&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;/span&gt;&lt;/code&gt;и&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;/span&gt;&lt;a title=&quot;In object-oriented programming and software engineering, the visitor design pattern is a way of separating an algorithm from an object structure&quot; href=&quot;http://en.wikipedia.org/wiki/Visitor_pattern&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;Visitor&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;  &lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;Методы сортировки:&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bubble_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;BubbleSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Gnome_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;GnomeSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Heapsort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;HeapSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Insertion_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;InsertionSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Selection_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;SelectionSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Merge_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;MergeSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Quick_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;QuickSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Shell_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;ShellSorter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;, &lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bucket_sort&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;BucketSorter&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;Автор обещает развивать библиотеку и дальше. &lt;/p&gt; &lt;p&gt;Не пропустите&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;/span&gt;&lt;a title=&quot;Data Structures and Algorithms&quot; href=&quot;http://www.brpreiss.com/books/opus6/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;сайт&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt; &lt;/span&gt;&lt;/code&gt;Bruno R. Preiss, на котором представлены реализации фундаментальных структур данных на различных языках программирования: C#, C++, Java, Python, Ruby, Lua, Perl, PHP и текст его книги&lt;code&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.brpreiss.com/books/opus6/html/book.html&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family:Trebuchet MS;&quot;&gt;Data Structures and Algorithms with Object-Oriented Design Patterns&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:d97382eb-d85e-480d-a80b-5a996769ddb5&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/%d0%90%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc%d1%8b&quot; rel=&quot;tag&quot;&gt;Алгоритмы&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tags/.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;&lt;/div&gt;
Blogus tags : &lt;a href=&quot;http://blogus.ru/tags/?%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&quot; rel=&quot;tag&quot;&gt;Алгоритмы&lt;/a&gt;,&lt;a href=&quot;http://blogus.ru/tags/?.NET&quot; rel=&quot;tag&quot;&gt;.NET&lt;/a&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/1545324042095156740/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/1545324042095156740' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1545324042095156740'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/1545324042095156740'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/generic-data-structures-and-algorithms.html' title='Generic Data Structures and Algorithms in .NET2.0'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699308797722855785.post-871069534618793849</id><published>2006-12-11T03:55:00.001+03:00</published><updated>2006-12-11T03:56:23.093+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Интернет"/><title type='text'>Подборка информации по качеству чистых DVD-дисков</title><content type='html'>&lt;p&gt;Сайт &lt;a title=&quot;Digital Media Guides &amp; Services&quot; href=&quot;http://www.digitalfaq.com/&quot; target=&quot;_blank&quot;&gt;digitalFAQ&lt;/a&gt; опубликовал &lt;a title=&quot;Not all media is good. In fact, with the high influx of cheap media from Taiwan, China and Hong Kong, I&#39;d venture to say most media is bad. This review guide is meant to shed some light on who manufactures and brands good and not so good quality DVD media.&quot; href=&quot;http://www.digitalfaq.com/media/dvdmedia.htm&quot; target=&quot;_blank&quot;&gt;сводную информацию&lt;/a&gt; по качеству DVD-дисков от различных производителей. Там же на сайте доступно расширенное руководство: &lt;a title=&quot;This guide originally started out as a single-page reference for those who wanted to buy high quality DVD media, with information on which discs are good and which discs are not so good. As time has gone on, and a few years have passed, the subject has grown more and more complex. We have also been asked several times to include articles on CD and VHS/S-VHS media&quot; href=&quot;http://www.digitalfaq.com/media/index.htm&quot; target=&quot;_blank&quot;&gt;Blank media quality guide &amp; FAQ&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;0767317B-992E-4b12-91E0-4F059A8CECA8:022dbd5a-6cda-4a18-ab4c-2a5aaf0dc363&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;Technorati tags: &lt;a href=&quot;http://technorati.com/tags/%d0%98%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82&quot; rel=&quot;tag&quot;&gt;Интернет&lt;/a&gt;&lt;/div&gt;
Blogus tags : &lt;a href=&quot;http://blogus.ru/tags/?%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82&quot; rel=&quot;tag&quot;&gt;Интернет&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://nsentinel.blogspot.com/feeds/871069534618793849/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1699308797722855785/871069534618793849' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/871069534618793849'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1699308797722855785/posts/default/871069534618793849'/><link rel='alternate' type='text/html' href='https://nsentinel.blogspot.com/2006/12/dvd.html' title='Подборка информации по качеству чистых DVD-дисков'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>