Создать форму Windows из фонового потока - PullRequest
2 голосов
/ 24 мая 2011

Я разрабатываю пакет VS, и у меня есть эта проблема:

У меня есть Background-Thread, который каждые несколько секунд проверяет конкретные изменения, которые необходимо сделать. Это включает в себя изменение графического интерфейса VS 2010, который отлично работает без вызова по некоторым причинам.

В любом случае, если я пытаюсь открыть новую форму, она открывается, но ничего не показывает, вылетает и не отвечает.
Я уже пробовал Application.OpenForms[0].invoke( /* delegate to create the form */).
Это отлично работает, , но у меня нет открытой формы все время .
Я также пытался создать System.Windows.Forms.Timer, , но сначала он не запускается .

Вопрос: Как получить правильный поток GUI для вызова моей формы?
или, скорее: Как я могу создать новую форму из моего фонового потока?

Ответы [ 2 ]

8 голосов
/ 24 мая 2011

Сохраните экземпляр SynchronizationContext.Current где-нибудь, когда ваше основное приложение запускается.После настройки.Вы можете попробовать следующий код в любом другом потоке.

 GuiContext.Send(_ => {
                        Form2 frm2=new Form2();
                        frm2.ShowDialog();
                       }, null);

Где GuiContext - это сохраненный экземпляр SynContext.

0 голосов
/ 17 мая 2013

Еще один способ сделать это без каких-либо глобальных переменных (извините за VB.NET - делал это в VB.NET):

 Dim result as Object
 Dim deleg As ThreadStart = Sub() result = DoSomethingHere()
 If Thread.CurrentThread.GetApartmentState <> ApartmentState.STA Then
 Dim t As New Thread(deleg)
     t.SetApartmentState(ApartmentState.STA) 'Set the thread to STA
     t.Start()
     t.Join() 'Wait for the thread to end
 Else
     deleg.Invoke()
 End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...