AsAsyncAction VS Task.Run

Всякий раз, когда мне нужно запустить параллельное задание, я обычно делаю это:

public async Task FindPerson(string personId)
{
    await Task.Run(() =>
    {
        //Search the person and write to screen 
    });
} 

Однако обычно я вижу другие кодеры, использующие AsAsyncOperation:

public IAsyncAction FindPerson(string personId)
{
    Task t = new Task(() =>
    {
        //Search the person and write to screen 
    });
    t.Start();
    return t.AsAsyncAction();
}

Кто-нибудь знает, какие преимущества дает AsAsyncAction по сравнению с использованием нового async/await?

2 ответа

Решение

AsAsyncAction для превращения задач в IAsyncAction быть переданным в WinRT. Если вы не используете WinRT, нет причин использовать это расширение.

Вы также не должны создавать задачу, а затем запустить ее. Task.Run предпочтительнее почти во всех случаях.

Вы также не должны создавать асинхронный метод, чтобы просто использовать Task.Run внутри него. Вызывающая сторона ожидает, что этот метод будет асинхронным, но все, что он делает - это выгружает синхронную работу в ThreadPool, Если звонящий нуждается в этой работе на ThreadPool лучше позволить им использовать Task.Run в их коде.

В общем, просто сделайте это:

public void FindPerson(string personId)
{
    // Search the person and write to screen 
}

И пусть вызывающая сторона вызывает этот метод синхронно или по ThreadPool нить:

Task.Run(() => FindPerson(personId));

Если вы посмотрите на страницу MSDN, вы увидите, что для IAsyncAction

  • .NET Framework Поддерживается в версиях: 4.6, 4.5
  • Приложения.NET для Windows Phone: Поддерживается в: Windows Phone Silverlight 8

если вы сравните это с задачей, вы увидите

  • Универсальная платформа Windows: доступно с версии 4.5
  • .NET Framework: доступно с версии 4.0
  • Портативная библиотека классов Поддерживается в: портативных платформах.NET
  • Silverlight: доступно с 5.0
  • Windows Phone Silverlight Доступно с 8.0
  • Windows Phone Доступно с 8.1

это сразу говорит о том, что IAsyncAction был создан специально для WinRT, который был первой настоящей попыткой MS создать платформу для мобильных приложений, потому что полная.net среда была слишком мощной, чтобы быть безопасной на мобильных устройствах, они создали параллельную сокращенную структуру, которая сделает его гораздо сложнее написать вредоносное программное обеспечение, которое может повредить устройство

так что если вы используете WinRT, то возврат IAsyncAction предпочтительнее в любом другом месте

Другие вопросы по тегам