Ожидание async TaskEx

Что такое TaskEx? В http://www.i-programmer.info/programming/c/1514-async-await-and-the-ui-problem.html?start=1 или ожидайте TaskEx.Delay или ожидайте асинхронного уточнения. Я использую

Task DoWork()
{
    return Task.Run(() =>
    {
        for (int i = 0; i < 30; i++)
        {
            Thread.Sleep(1000 * 60 * 30);
        }
    });
}

Примеры используют это

Task DoWork()
{
   return TaskEx.Run(() =>
   {
     for (int i = 0; i < 10; i++)
     {
         Thread.Sleep(500);
     }
   }
 });

Я называю это как await DoWork(); Если вы используете только Task, await ничего не возвращает и ответа нет. Если я использую TaskEx, он говорит, что не существует в контексте. Должен ли TaskEx быть классом или чем-то вроде функции? Кулаки одна работает это моя ошибка.

Ответ 1

TaskEx был просто дополнительным классом, который первоначально поставлялся с CTP-асинхронными/ожидающими расширениями для С# 5 до отправки .NET 4.5... и теперь является частью Async Targeting Pack (ака Microsoft.Bcl.Async пакет NuGet), если вы хотите использовать async/wait, но настроите на него .NET 4.0 (который не для этого требуется некоторый код).

Если вы используете .NET 4.5 или новее, просто используйте Task.Run, что делает то же самое. (Вы не будете использовать пакет таргетинга, поэтому у вас не будет TaskEx.) Пакет асинхронного таргетинга не может добавить статический метод в существующий класс Task, следовательно, потребность в TaskEx, существующем в все.

Ответ 2

"TaskEx это класс, который существует только в CTP, так как не было никакого способа, чтобы добавить дополнительные методы к существующему классу задач в структуре (как CTP осуществляется с помощью отдельного узла).

Он не будет существовать в окончательной RTM-версии фреймворка. Методы, определенные в TaskEx, будут перенесены в Task. "

Источник: https://social.msdn.microsoft.com/Forums/en-US/74c5ba79-76cc-4f73-a3fa-35616525ab80/what-is-the-difference-between-task-and-taskex-?forum=async

CTP - это версия предварительного просмотра сообщества платформы компилятора .NET.

Ответ 3

Этого также можно достичь с помощью System.Threading.Timer. как написано в документации API:

If period is zero (0) or Timeout.Infinite и dueTime is not Timeout.Infinite, callback is invoked once […]

Ergo, таймер одиночного выстрела может быть создан как, например,

Timer oneShotTimer = new Timer((object stateInfo) => {
  // your callback code here
}, null, yourOneShotTimePeriodHere, Timeout.Infinite);

В API также есть хитрость, позволяющая избавиться от таймера из его метода обратного вызова: fooobar.com/info/1342785/...