Конечно, это ожидаемое поведение.Вы вызываете Invoke, который выполняет вызов другого потока.Затем вызывающий поток продолжает работать, и блок using завершает работу, вызывая Dispose в потоке.Это удаление происходит до того, как вы закончите (и, возможно, перед тем, как начать), используя поток в потоке пользовательского интерфейса.Точное время этих действий будет зависеть от загрузки процессора и некоторых других факторов, но это, безусловно, небезопасно.
Либо не помещайте поток в блок using, либо лучше, пока поток выполняет чтение ипередать результаты в пользовательский интерфейс через Invoke.
EDIT
Как указывает Ганс в комментарии, приведенное выше объяснение должно быть для BeginInvokeвызов, который под вызовами PostMessage.Invoke, с другой стороны, использует SendMessage.Оба, вероятно, используют некоторые shenanigans WM_COPYDATA (я не смотрел, чтобы видеть), чтобы упорядочить данные.
Вызов Invoke должен выполнять весь обработчик, который вы опубликовали, хотя поведение вы видитеуказывает на обратное.Исходя из кода, который вы опубликовали, у нас нет реального способа определить, что закрывает поток.
Я все равно реорганизовал бы то, что вы здесь сделали, потому что сейчас вы связываете пользовательский интерфейс и рабочие потоки с помощьюоперация чтения.Я выполняю работу по чтению в рабочем потоке, а затем передаю результаты в пользовательский интерфейс.Это уменьшит шансы читателя на работу, вызывая прерывистость пользовательского интерфейса, и исключит возможность закрытия потока во время чтения из него.