Подтвердить что ты не робот

Async/await ключевые слова, недоступные в .net 4.0

Я хотел бы использовать async/await в С# 4.0, и я установил следующий пакет:

http://www.nuget.org/packages/Microsoft.Bcl.Async/

Проблема в том, что у меня нет доступных асинхронных/ожидающих ключевых слов.

Я использую VS2010 с SP1.

Благодарю.

4b9b3361

Ответ 1

Вы не получите лучшего ответа, чем Jon Skeet.

Единственный поддерживаемый способ сделать это - использовать VS2012 с Microsoft.Bcl.Async.

VS2010 очень сложно работать с async/await. Был старый пакет Async CTP (в котором было много ошибок, которые никогда не были исправлены), которые выступали в качестве "дополнительной" / "частичной замены" на VS2010. Однако этот пакет никогда не работал с обновлениями VS2010. Итак, вам нужно сначала найти версию одного из старых установщиков CTP, поиграть с установкой некоторых обновлений VS, а затем посмотреть, работает ли CTP. Если вы уже установили все ваши обновления VS2010, то никакая версия CTP не будет работать. Я думаю, как только вы обнаружите ситуацию с обновлением, где вы можете установить рабочий CTP, тогда вы можете установить другие обновления.

После всей этой работы вы все равно закончите с ошибкой (и определенно неоптимизированную) реализацию async.

Или, вы можете сделать, как предложил Jon Skeet, и загрузить бесплатную версию VS2012 Express с помощью Microsoft.Bcl.Async и иметь полностью поддерживаемое решение.

Ответ 2

Async/Await были введены с C# 5.0 и .NET Framework 4.5

Дополнительная информация здесь:

Асинхронное программирование с использованием Async и Await (С# и Visual Basic)

Асинхронное программирование в С# 5.0 с использованием async и ожидания

Если вы используете Framework 4, как я делаю на предприятии, вы можете использовать другие обходные пути. Вы можете использовать пакет NuGet, который позволяет использовать эти функции.

Использование async/await без .NET Framework 4.5

Просто установите его из диспетчера пакетов NuGet:

Установочный пакет Microsoft.Bcl.Async

Извлечен из Галерея NuGet:

Этот пакет позволяет проектам Visual Studio 2012 использовать новые ключевые слова "async" и "ожидание". Этот пакет также включает методы расширения на основе задач, которые позволяют использовать некоторые из существующих асинхронных API-интерфейсов с новыми языковыми ключевыми словами. Проекты Windows Phone Silverlight 8 могут использовать этот пакет для доступа к методам расширения async для сетевых типов.

Ответ 3

Я написал плагин .NET 4.5, используя async для приложения .NET 4.0, и, к моему удивлению, это действительно сработало!

Я думаю, что это сработало, потому что у меня установлен .NET 4.5, который заменил среду .NET.NET на обновленную, которая используется как для .NET 4.0, так и для .NET 4.5. Затем мой плагин был загружен с использованием Assembly.Load(...) или аналогичного. Я попробовал как async/await, так и Environment.CurrentManagedThreadId (свойство .NET 4.5), и оба работали.

Таким образом, если установка .NET 4.5 является опцией (т.е. не поддерживающей Windows XP), можно использовать сочетание, загрузив часть приложения .NET 4.5 через отражение, возможно, чтобы ваша часть 4.5 реализовала интерфейс 4.0. Однако, если вы сами пишете приложение, гораздо более простым решением будет переход на .NET 4.5 для всего проекта.

Ответ 4

using System.Threading.Tasks;

private void simpleMethod()
{
    var tsk = Task.Factory.StartNew(() => DoSomeWorkAsync());
    Task.WaitAll(tsk);
    DataTable table = tsk.Result;
}

Важно, чтобы асинхронный метод не содержал методов, влияющих на элементы управления формой.

    private DataTable DoSomeWorkAsync()
    {           
        System.Data.DataTable table = new System.Data.DataTable();
        Thread.Sleep(4000); // Any long time process
        return table;
    }

Дополнительная информация: https://www.simplethread.com/net-40-and-systemthreadingtasks/