Новые методы: реализация INFINITE LOOP, который может быть остановлен по запросу

Каков правильный метод для реализации бесконечно выполняемой задачи, которая выполняет Async BigJob()? и может быть остановлен по запросу

Совет. Я пытаюсь изучить новый метод для обновления моей существующей стратегии.

У меня есть эта простая программа (тестер), в которой есть кнопка Старт и Стоп.

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

Важным моментом является то, что основной процесс /action/bigJob () - это и awaitable асинхронный процесс.

Итак, я бы псевдокод все это как

Start
 Round 1 starts
 Async Main job starts
 Async connect
 Async Read
 Async Write
 Async disconnect 
 Nobody cancelled me yet
 Round 1 finishes
 Round 2 starts
 .
 .
 .
 Round 2 finishes
 Round 3 starts
 .
 Stop pressed, hence break out. 
Stop

Поэтому я использую BackgroundWorker для реализации бесконечного цикла и Async/Await для подключения, чтения, записи и отключения, которые я написал в C# в разделе .Net 4.5

Так как мои подзадачи, такие как Подключить и .etc, async, моя основная задача - async, и нажатие кнопки Stop останавливает мой процесс, так как исключает бесконечный цикл while что у меня есть

while (!bw.CancellationPending)
{
 await MainTask();
 ...
}

но он не запускает событие BackgroundWorker_RunWorkerCompleted, которое не причиняет мне никакого вреда, если это меня убивает, так как фоновый рабочий не работает так, как он предполагал, и я просто продолжаю думать: "должно быть лучше путь!".

Итак, я читал о стольких новых идеях, например, почему вообще использовать BackgroundWorker сейчас, когда у нас есть Async/Await. Некоторые говорили, что используют Task.Run() магические. Я даже читал рекомендации и блоги об этом godsend TPL Dataflow, о котором я никогда не слышал. И пока я не нашел метод, который структурирован, задокументирован и выложен как BackgroundWorker. (если только такой простой или один лайнер, который даже не нуждается в документации или .etc) Итак, ребята, какое решение для этого. Или лучше спросить:

Каков правильный метод для реализации бесконечно выполняемой задачи, которая выполняет Async BigJob()? и может быть остановлен по запросу

3 ответа

Вы должны использовать CancellationTokenSource. Но не передавайте Token методу Task.Run и не генерируйте исключение. Просто проверьте, была ли запрошена отмена, а затем остановилась.

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task.Run(
 async () =>
 {
 while (!ct.IsCancellationRequested)
 { 
 await ConnectAsync();
 await ReadAsync();
 await WriteAsync();
 await DisconnectAsync();
 }
 });
cts.Cancel();

Когда вы передаете CancellationToken самой Задаче (Task.Run(async () => ..., ct)), вы не можете использовать ее внутри делегата. Он отменяет задачу только в том случае, если отмена была вызвана до, когда задача запущена. После того, как он начнется, вызов Cancel не будет иметь никакого эффекта.


Создайте CancellationTokenSource и передайте его токен в задачу async. Это позволит вам сигнализировать о ваших задачах асинхронного запроса, требующих отмены. Дополнительная информация: http://msdn.microsoft.com/en-us/library/hh873177 (v = vs .110).aspx


Я настоятельно рекомендую всем прочитать про три различные методы асинхронные шаблоны программирования и использование недавний и предпочтительный метод Асинхронный шаблон на основе задач (TAP)

Модель асинхронного программирования (APM) Описывает устаревшую модель, которая использует интерфейс IAsyncResult для обеспечивают асинхронное поведение. Эта модель больше не рекомендуется для новая разработка.

Асинхронный шаблон на основе событий (EAP) Описывает основанную на событиях устаревшую модель для обеспечения асинхронного поведение. Эта модель больше не рекомендуется для новой разработки.

Асинхронный шаблон на основе задач (TAP) Описывает новый асинхронный шаблон, основанный на System.Threading.Tasks пространство имен. Эта модель является рекомендуемой подход к асинхронному программированию в .NET Framework 4 и более поздних версиях версии.

Благодаря @SKall для указания на правильное направление.

licensed under cc by-sa 3.0 with attribution.