Я использую Pcap.Net для мониторинга трафика, и мне нужно, чтобы он принимал пакеты, пока пользователь не запросит отмену. Я создаю задачу мониторинга следующим образом (упрощенно):
var task1 = Task.Run(() => { communicator.ReceivePackets(0, PacketHandlerCallback); } /*, token*/);
Здесь 0
говорит, что выполнение ReceivePackets
никогда не заканчивается, PacketHandlerCallback
— это метод, который будет выполняться для каждого полученного пакета. ReceivePackets
является синхронным и не поддерживает отмену. Вообще в моем вопросе это может быть любой другой бесконечный синхронный метод, код которого мы не можем редактировать.
Вопрос в том, как остановить выполнение этого метода?
Просто передача маркера отмены в задачу не помогает, потому что мы также должны явно проверять, запрошена ли отмена, например. г. по телефону
token.throwIfCancellationRequested()
.Передача токена в метод обратного вызова также не является решением, потому что этот метод не будет вызываться до тех пор, пока не будет получен новый пакет, но я хотел бы остановить свою задачу сразу после отмены.
Использование
BackgroundWorker
вызывает тот же вопрос, так как мы должны проверитьCancellationPending
.Создание
task2
, которое периодически проверяет запросы на отмену, а затем записьvar task = Task.WhenAny(task1, task2)
не помогает, посколькуReceivePackets
все равно будет выполняться.
Должен ли я использовать Thread.Abort()
или, может быть, есть какое-то другое элегантное решение?
Есть похожие вопросы о TPL на SO, но я не могу найти простого и полезного ответа.
communicator.NonBlocking = true
, а затем переписать свой код, чтобы вместо этого использоватьcommunicator.ReceiveSomePackets
в неблокирующем режиме, тогда вам не придется беспокоиться о зависании кода, и вы можете просто избавиться от коммуникатора, когда захотите все очистить. - person Scott Chamberlain   schedule 03.06.2017while(true) { communicator.ReceiveSomePackets(/*args*/); token.throwIfCancellationRequested(); }
для неблокирующего коммуникатора, я не потеряю пакеты, которые могут быть получены при проверке запроса на отмену? - person N. Kudryavtsev   schedule 03.06.2017