Как можно заменить строку ниже в .net4.0

Как я могу написать ниже строку кода в .net 4.0:

EventHandlerTaskAsyncHelper asyncHelper = new EventHandlerTaskAsyncHelper(WriteLogMessages);--> this is in .net 4.5

Спасибо


person user3318540    schedule 16.01.2015    source источник
comment
Возможно, установить .NET 4.5?   -  person leppie    schedule 16.01.2015
comment
Если это единственная строка кода, которая вызывает у вас проблемы, вы можете просто взять реализацию из Источник ссылок. Однако я подозреваю, что на самом деле это лишь верхушка айсберга в попытке обратно преобразовать некоторый код .NET 4.5 в 4.0.   -  person Damien_The_Unbeliever    schedule 16.01.2015
comment
Спасибо за ответ. Я создаю приложение в .net 4.0, которое использовалось в .net 4.5. @leppie   -  person user3318540    schedule 16.01.2015
comment
Не удалось найти обработчик событий типа или пространства имен. Я получаю эту ошибку. Как я могу это решить? @Damien_The_Unbeliever   -  person user3318540    schedule 16.01.2015
comment
Что ты пытаешься сделать? Вы не можете просто взять код, использующий функции .NET 4.5, и ожидать, что он будет работать в 4.0. Вы можете обойти это с помощью пакета Microsoft.Bcl.Async, но реальное решение — обновить код до версии 4.5.   -  person Panagiotis Kanavos    schedule 16.01.2015


Ответы (2)


EventHandlerTaskAsyncHelper — это просто помощник, который предоставляет интерфейс в стиле APM (BeginOperation/EndOperation) над задачей. Задача реализует IAsyncResult, поэтому вы можете вернуть его непосредственно из метода BeginOperation. Метод EndOperation должен только привести свой аргумент IAsyncResult обратно к задаче и ожидать ее. Это показано в статье MSDN TPL и Традиционное асинхронное программирование .NET Framework:

 public IAsyncResult BeginCalculate(int decimalPlaces, AsyncCallback ac, object state)
{
    Task<string> f = Task<string>.Factory.StartNew(_ => Compute(decimalPlaces), state);
    if (ac != null) f.ContinueWith((res) => ac(f));
    return f;
}

public string Compute(int numPlaces)
{
    ...
}

public string EndCalculate(IAsyncResult ar)
{
    return ((Task<string>)ar).Result;
}

Класс EventHandlerTaskAsyncHelper just упрощает написание такого кода с некоторыми проверками уже выполненных задач и т. д. Эта концепция не является чем-то специфичным для .NET 4.5.

Тем не менее, лучшим решением было бы обновить остальную часть вашего кода до .NET 4.5, а не пытаться перенести приложение на .NET 4.0. Хотя вы можете получить некоторые функции версии 4.5 с помощью Microsoft. Bcl.Async, важные части будут отсутствовать. Более новые библиотеки, такие как TPL Dataflow, Immutable Collections и т. д., просто требуют для работы .NET 4.5.

Если вы не ориентируетесь на Windows XP, нет причин оставаться на .NET 4.0, особенно когда приложение уже написано на 4.5.

person Panagiotis Kanavos    schedule 16.01.2015

Основная проблема такой миграции заключается в том, что вы пытаетесь вписаться в архитектурное решение, доступное только в .NET 4.5. Согласно MSDN, EventHandlerTaskAsyncHelper единственная цель:

Преобразует асинхронные методы, возвращающие задачу, в методы, использующие модель асинхронного программирования, используемую в предыдущих версиях ASP.NET и основанную на начальных и конечных событиях.

И раздел примечаний:

Для обработки асинхронных задач в ASP.NET 4.5 вы реализуете логику для возврата задачи в виде делегата TaskEventHandler. Эта модель асинхронного программирования на основе задач заменяет модель, использовавшуюся в предыдущих версиях ASP.NET, которая основывает всю обработку событий на начальных и конечных событиях. ...

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

Может быть, эта тема будет хорошим началом:

ASP.NET MVC — IHttpModule, Обработчик асинхронных событий, EventHandlerTaskAsyncHelper

person VMAtm    schedule 16.01.2015
comment
Три проблемы с этим ответом. Задачи были представлены в .NET 4.0, и статьи о том, как преобразовать стиль APM в/из задач, были опубликованы с самого начала. Библиотека параллельных расширений содержит расширения и помощники для многих распространенных классов, таких как Smtp, WebRequest и т. д., и, вероятно, была источником EventHandlerTaskAsyncHelper. Во-вторых, ASP.NET никогда не упоминался. В-третьих, ссылка показывает только пример использования EventHandlerTaskAsyncHelper. - person Panagiotis Kanavos; 16.01.2015
comment
@PanagiotisKanavos 1. EventHandlerTaskAsyncHelper используется в ASP.NET 4.5, его пространство имен — System.Web, как я указал, и он не является частью параллельных расширений. 2. Я не могу понять, почему вы говорите о Заданиях, ведь они вообще не упоминаются. 3. Ссылка о реализации IHTTPModule, которая может представлять интерес для ОП, так как я не знаю, что именно он хочет сделать. - person VMAtm; 16.01.2015
comment
Упс, пространство имен не проверял, но функциональность не специфична для ASP.NET. Это общая реализация вызова методов Begin/End из Tasks, аналогичная примеры MSDN для .NET 4.0. Если бы я был ОП, меня бы больше беспокоили отсутствующие веб-функции 4.5, а не вспомогательная реализация. - person Panagiotis Kanavos; 16.01.2015