Новые методы: реализация 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)

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

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

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

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

licensed under cc by-sa 3.0 with attribution.