Как .Net обрабатывает параллельный сетевой трафик на одном сетевом адаптере?

#c# #.net #multithreading #ffmpeg #network-programming

Вопрос:

У меня проблема с моим.Сетевое приложение, в котором я пытаюсь выполнить две вещи одновременно на одном сетевом адаптере. Этот сетевой адаптер обрабатывает мой трафик локальной сети и мой интернет-трафик. У меня есть IP-камера в моей локальной сети, которая передает потоковое видео, которое я получаю и обрабатываю в своем приложении через FFMPEG. Кадры поступают со скоростью 10 кадров в секунду, и каждый раз, когда появляется кадр, вызывается обработчик событий, который содержит кадр, чтобы я мог его обработать.

В дополнение к этому мое приложение также каждую минуту выполняет вызовы RESTful Web API в Интернет, которые я настроил на System.Threading.Timer . Я надеялся, что с помощью таймера вызовы веб-API будут выполняться одновременно и не повлияют на обработчик событий моих видеокадров.

Однако периодически, когда мой таймер тикает и я выполняю вызов Web API, я сбрасываю несколько кадров на сетевую камеру. Сложно устранить неполадки, если проблема связана с FFMPEG или самой сетью (т. Е. Фреймы даже не попадают в FFMPEG для начала). Я говорю с перерывами, потому что это происходит не каждый раз, когда я вызываю веб-API, но когда это происходит, это всегда происходит, когда я выполняю вызов API. Также кажется, что это происходит чаще, когда вызов API занимает немного больше времени.

Итак, мой вопрос в том, как это происходит.Net обрабатывает сетевой адаптер в подобной ситуации? Ожидается ли, что это приведет к узким местам производительности, если два потока одновременно пытаются получить доступ к сетевой карте? Я отслеживал сетевой трафик через диспетчер задач, и я далек от 100%, так что дело не в том, что я переполняю сеть (чего я ожидал бы от отброшенных пакетов в этот момент). Это должно быть что-то с how .Net обрабатывает доступ к сетевой карте из одного и того же процесса, даже если из двух разных потоков?

Спасибо!

Комментарии:

1. Извините, если это глупый комментарий, но вы уверены, что проблема в сетевой карте? System.Threading.Timer выполняет обратный вызов (т. Е. Ваш вызов API) в потоке threadpool, а 10 кадров в секунду — это один кадр каждые 100 мс. Итак, в зависимости от того, сколько времени требуется для обработки каждого кадра и характеристик вашего компьютера, а также от того, как реализован ваш обработчик событий (может быть, хорошей идеей опубликовать код здесь), не может ли быть так, что при вызове API, даже если используется только один поток, пул потоковзаканчиваются доступные потоки, и до тех пор, пока не будет создан новый или не будут доступны некоторые кадры, они отбрасываются?

2. @evilmandarine Спасибо за ответ, а вовсе не за тупой комментарий! Во всяком случае, я делаю что-то глупое. Вы правы, это может быть не сетевой адаптер, и я уверен, что это я. Я предположил, что запуск моего вызова API, который я хотел выполнять с интервалом, в системе. Многопоточность. Таймер, чтобы он выполнялся в другом потоке и не влиял на другие вещи, которые я делаю с кадрами, поступающими через обработчик событий. Это неправильное мышление, и они все еще могут бороться друг с другом?

3. Он выполняется в другом потоке, но это поток пула потоков. Подробнее об этом здесь . Поэтому, если ваша обработка также использует один поток на кадр из пула, вызов API может привести к удалению кадров (больше не будет доступных потоков). Но трудно сказать, не видя кода. Вы могли бы попытаться явно создать свой собственный поток для этого вызова, а также измерить, сколько времени занимает обработка одного кадра.