Ожидание 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/...