从后台线程创建Windows窗体

时间:2011-05-24 10:38:50

标签: c# winforms multithreading thread-safety

我正在开发一个VS包,我遇到了这个问题:

我有一个Background-Thread,它每隔几秒检查一次必须进行的具体更改。这包括更改VS 2010的GUI,由于某种原因,它可以完美地运行而无需调用

无论如何,如果我尝试打开一个新表格,它会打开,但它不显示任何内容,崩溃并且没有响应。
我已经尝试了Application.OpenForms[0].invoke( /* delegate to create the form */) 这很好,但我没有一直打开表格 我还尝试创建一个System.Windows.Forms.Timer,但它首先没有启动

问题:如何获取正确的GUI线程来调用我的表单?
或者更确切地说:如何从后台线程创建新表单?

2 个答案:

答案 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