Это классическая проблема при использовании потоков. Переменная экземпляра формы имеет атрибут <ThreadStatic
>. Что заставляет его создавать новый экземпляр формы, когда ваш код выполняется в другом потоке. Это может быть трудно обнаружить, форма не видна, так как вы не вызывали ее метод Show (). Не то чтобы это все равно работало, поток не качает цикл сообщений.
У вашего обходного пути есть свои проблемы. В реализации Application.OpenForms есть неприятная ошибка: она теряет форму, когда их окно воссоздается. Попробуйте этот код, например:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.ShowInTaskbar = False
MessageBox.Show(String.Format("There are {0} form instances", Application.OpenForms.Count))
End Sub
Существует множество возможных исправлений вашей проблемы. Вы можете перенаправить вызов в поток пользовательского интерфейса с помощью Control.Begin / Invoke (). Хотя для этого требуется доступ к форме или контрольному экземпляру, это немного проблематично. Лучше всего просто передать экземпляр формы в конструктор класса помощника:
Class Helper
Private mForm As Form1
Public Sub New(ByVal frm As Form1)
mForm = frm
End Sub
End Class
Теперь у вас есть нужный вам экземпляр.