Помогите с проблемой работы потоков и Timer !!!!!

Описываю обмен пакетами по сети, возникла проблема, я очень сильно подозреваю что я
где то накосячил. Суть:
есть асинхронный метод Socket.ReceiveFromAsync, по идеи какждый раз когда появляются данные которые я получаю метод выполняется в разных потоках, сделал Thread.CurrentThread.ManagedThreadId и вижу в каком № потока выполняется обработка данных, ну суть не в том. Вообщем перед отправкой данных я использую Thread.Timer для ожидания ответа на пакет выставляю через сколько я жду ответ, если ответ не приходит выполняется бональная операция повторной отправки того же пакета. Вот тут и происходит странность как я понимаю, начала всей процедуры отправки выполняется в потоке формы при нажатии на кнопку отправить, соответственно и Thread.Timer инициализируется в потоке окна, а функция которая выполняется если время прошло и ответ не пришел, выполняется в другом потоке, это понятно, вот только получаю такой сбой, пришел ответ, Socket.ReceiveFromAsync выполняет получение пакета в случайном потоке, там выполняется уничтожение Thread.Timer-а, но если даже на .0001 раньше наступило событие об окончании времени ожидания, после того как я делаю timer.dispose() спустя некоторое время, в другом потоке наступает событие окончания ожидания, и получается по факту я уже удалил таймер,
но функция которая была в соседнем потоке на ожидании не остановилась и при наступлении она внутри запускает процедуру повторной отправки данных и должна перезапустить таймер timer.change() а он уже уничтожен. происходит сбой.
конечно я добавил некую переменную и делаю Interlocked.Add(ref _records[key]._check_ctl_acp, 1); а перед проверкой перезапуска таймера при функции повторной отправки я проверяю if (Thread.VolatileRead(ref record._check_ctl_acp) == 0), это позволило точно знать был ли таймер где то остановлен в другом потоке или нет.
Но я очень сомниваюсь что такой подход правильный, возможно есть другой вариант решения ?

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

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