我正在开发一个VS包,我遇到了这个问题:
我有一个Background-Thread,它每隔几秒检查一次必须进行的具体更改。这包括更改VS 2010的GUI,由于某种原因,它可以完美地运行而无需调用。
无论如何,如果我尝试打开一个新表格,它会打开,但它不显示任何内容,崩溃并且没有响应。
我已经尝试了Application.OpenForms[0].invoke( /* delegate to create the form */)
这很好,但我没有一直打开表格
我还尝试创建一个System.Windows.Forms.Timer,但它首先没有启动。
问题:如何获取正确的GUI线程来调用我的表单?
或者更确切地说:如何从后台线程创建新表单?
答案 0 :(得分:8)
在主应用程序启动时,在某处存储SynchronizationContext.Current的实例。 一旦设置好。 您可以尝试在任何其他线程中使用代码。
GuiContext.Send(_ => {
Form2 frm2=new Form2();
frm2.ShowDialog();
}, null);
其中GuiContext是存储的SynContext实例。
答案 1 :(得分:0)
没有任何全局变量的另一种方法是(抱歉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