Как преобразовать пример .net 4.5 Async / Await обратно в 4.0

Как будет выглядеть эквивалентный код asp.net mvc 4.0?

using System.Net;
using System.Net.Http;
using System.Web.Mvc;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace Web.Controllers
{
    public class HomeController : Controller
    {
        private HttpClient httpClient = new HttpClient();
        private static dynamic shots;

        public async Task<ActionResult> Index()
        {
            if (shots == null)
            {
                try
                {
                    var responseMessage = 
                       await httpClient.GetAsync
                            ("http://api.dribbble.com/shots/everyone?per_page=30");
                    responseMessage.EnsureSuccessStatusCode();

                    var value = await responseMessage.Content.ReadAsStringAsync();
                    shots = await JsonConvert.DeserializeObjectAsync<dynamic>(value);
                }
                catch (WebException)
                {
                }
            }
            return View(shots);
        }
    }
}
 musefan12 июн. 2012 г., 12:31
это действительно работает? безумие! ..попробуй эти сумасшедшие 4,5 штуки. Если я хочу асинхронного взаимодействия с пользователем, я использую ajax / json, если я хочу, чтобы асинхронный сервер работал без необходимости возвращать данные клиенту, я бы, вероятно, посмотрел бы на порождение потока или использование фоновый рабочий
 Panagiotis Kanavos12 июн. 2012 г., 12:33
Параллельная библиотека задач - это функция .NET 4, которая работает очень хорошо. Нет абсолютно никакой необходимости использовать более тяжелого и более громоздкого фонового работник

Ответы на вопрос(5)

 Nicholas Petersen10 апр. 2013 г., 19:34
Смешно, что кто-то проголосовал так же, как и мой ответ ниже. Я проголосовал за это, чтобы сравнять его обратно.

НОТА Это только для Async / Await.

Самый простой способ - использовать Async CTP. Он имеет лицензию Go live, что означает, что вы можете использовать ее в рабочем коде. Вам придется внести некоторые изменения в случаях, когда Async CTP не предоставляет асинхронные эквиваленты.

Вы можете использовать Async CTP в Azure, так как требуется только дополнительная DLL. Здесь есть похожий вопрос SO Async CTP и поддержка Windows Azure

Я использую Async CTP более года без проблем. Я определенно рекомендую это. Обновление до .NET 4.5 довольно просто, по сути, требуются только некоторые изменения имени класса (TaskEx to Task) и несколько изменений подписи.

Если вы можете использовать Visual Studio 2012 RC, вы также можете использовать Async Targeting pack, который позволит вам использовать свой асинхронный код в .NET 4 с меньшим количеством изменений, чем при использовании Async CTP.

Наконец, решение грубой силы состоит в том, чтобы использовать TaskIterator из примеров ParallelExtensionsExtras, чтобы эмулировать, что делает async / await. Вам нужно будет преобразовать все асинхронные вызовы в задачи или методы, которые возвращают задачу, а затем выполнить итерацию по списку этих задач. Это намного больше кода, но это единственное решение, если вы не хотите использовать CTP-код, даже если у него есть лицензия Go Live.

Параллельные расширения включают в себя асинхронные задачи для WebClient, что может быть полезно, если вы решите переключиться с HttpClient на WebClient.

 Panagiotis Kanavos12 июн. 2012 г., 12:53
PS ... Я потерял бесчисленные часы, работая с WebClient и его бесплатными исключениями. Жаль, что я не знал о HttpClient на Nuget 6 месяцев назад ...
 superlogical12 июн. 2012 г., 12:45
HttpClient находится на NuGet, и вы можете использовать его из .Net 4.0. Причина, по которой я нацеливаюсь на .Net 4.0, заключается в том, что AppHarbor и Azure по-прежнему используют .Net 4.0 и не будут обновляться, пока не будут выпущены Windows 8 и Server 2012. Спасибо за ссылку на эту страницу TaskIterator, я проверю это:)
 Panagiotis Kanavos12 июн. 2012 г., 12:50
Вы можете использовать Async CTP даже в Azure, поскольку вам нужно только развернуть дополнительную DLL.
 Panagiotis Kanavos10 апр. 2013 г., 11:11
HttpClient отсутствует в Async CTP, он находится в своем собственном пакете
 superlogical12 июн. 2012 г., 13:02
Ладно, ха-ха, придется проверить это. Да, есть много внеплановых релизов, когда RC-биты выпускаются MS через NuGet, что довольно круто.

ПРЕДУПРЕЖДЕНИ Нет проверки ошибок!

Ну, я чувствую, что сегодня что-то узнал, прочитайте эту статьюhttp: //blogs.msdn.com/b/pfxteam/archive/2010/11/21/10094564.asp, чтобы узнать лучший способ справиться с этим

using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Mvc;
using Newtonsoft.Json;
namespace DribbbleR.Web.Controllers
{
    public class HomeController : Controller
    {
        private static dynamic shots;
        private HttpClient client = new HttpClient();
        private string url = "http://api.dribbble.com/shots/everyone?per_page=30";

        public Task<dynamic> Index()
        {    if (shots == null)
             shots = Task.Factory.StartNew
                   (() => return DownloadContent();).Unwrap();    
             return shots;
        }
        public Task<dynamic> DownloadContent()
        {    var responseTask = client.GetAsync(url);
             var readTask = responseTask.ContinueWith
                 (t =>
                     {   t.Result.EnsureSuccessStatusCode();
                         return t.Result.Content.ReadAsStringAsync();
                      }
                  ).Unwrap();
            var deserializeTask = readTask.ContinueWith
                  (t => return JsonConvert.DeserializeObjectAsync<dynamic>(t.Result);)
            .Unwrap();
            var viewTask = deserializeTask.ContinueWith
                  (t =>  return this.View(t.Result););
            return viewTask;
        }
    }
}

исследующий, как заставить все это работать и в .NET 4.0, я не нашел ответы на этот вопрос, а другие достаточно полные, чтобы немедленно приступить к работе. Таким образом, ниже приведен более полный ответ о том, что просто делать:

======= ШАГ № 1) УСТАНОВИТЕ Клиентские библиотеки (RC) Microsoft ASP.NET Web API 4.0.20505.0 =======

http: //nuget.org/packages/Microsoft.AspNet.WebApi.Clien

PM> Install-Package Microsoft.AspNet.WebApi.Client

INSTALLS: System.Net.Http.dll, System.Net.Http.Formatting.dll, System.Net.Http.WebRequest.dll, Newtonsoft.Json.dll

======= ШАГ # 2) Клиентские библиотеки HTTP Microsoft .NET Framework 4 2.0.20505.0 =======

http: //nuget.org/packages/Microsoft.Net.Htt.

PM> Install-Package Microsoft.Net.Http.

Если вы уже выполнили шаг № 1, NuGet уже должен был получить эту зависимость: System.Net.Http.dll. System.Net.Http. это то, что предоставляет HttpClient, HttpRequestMessage и HttpResponseMessage.

В этот момент вы будете получать ошибки при использовании async / await (хотя эти ключевые слова по-прежнему отображаются как ключевые слова), говоря что-то вроде:

Не удается найти все типы, требуемые модификатором 'async'. Вы нацелены на неверную версию фреймворка или не имеете ссылки на сборку?

Thus:

======= ШАГ № 3) Async Targeting Pack для Visual Studio =======

http: //www.microsoft.com/en-us/download/details.aspx ID = 29576

PM> Install-Package Microsoft.CompilerServices.AsyncTargetingPack

(В NuGet необходимо обновить имя Visual Studio 11, обе версии 1.0.0)

Устанавливает 1 dll: Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll

«Пакет Async Targeting Pack для Visual Studio 2012» позволяет проектам с таргетингом на .NET Framework 4.0 или Silverlight 5 использовать функцию языка Async в C # 5 ... "http: //www.microsoft.com/en-us/download/details.aspx ID = 29576

Помимо прочего, добавляет TaskEx (версия .NET 4.0, которая заполняет многие новые функции Task. TaskEx предназначен только для версии 4.0 ... поэтому .NET 4.5: «Task.Run» в версии 4.0: «TaskEx.Run» многие другие вещи похожи на эту библиотеку)

Внезапно, жди и асинхронно, и вся работа начинает работать как шарм! Если задуматься, одна из самых важных вещей об этом - это класс (объявленный без пространства имен): AsyncCompatLibExtensions. Статический класс, содержащий методы расширения, особенно: 1) Поток. Например. ReadAsync. Так что теперь поток. ReadAsync внезапно появляется! (на самом деле он чисто оборачивает поток BeginRead / BeginWrite, если вы хотите знать), 2) WebClient. Например. webClient.DownloadStringTaskAsync и другие.

 Nicholas Petersen10 апр. 2013 г., 19:31
Я не могу поверить, что кто-то просто дал мне отрицательную оценку за терпеливую передачу этой информации сообществу. Если вы настоящий мужчина или женщина, как насчет размещения комментария с ним. Вы, вероятно, тот же человек, который проголосовал против er-v выше, что бессмысленно. И, кстати, обратите внимание, что дата 4.5 еще не вышла, так что этот ответ, вероятно, теперь может быть заменен.

Ваш ответ на вопрос