从后台线程创建Windows窗体

Sim*_*ker 2 c# multithreading thread-safety winforms

我正在开发一个VS包,我有这个问题:

我有一个Background-Thread,每隔几秒检查一次必须进行的具体更改.这包括更改VS 2010的GUI,由于某种原因,它在没有调用的情况下工作得很好.

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

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

cry*_*ted 8

在主应用程序启动时,在某处存储SynchronizationContext.Current的实例.一旦设置好.您可以尝试在任何其他线程中使用代码.

 GuiContext.Send(_ => {
                        Form2 frm2=new Form2();
                        frm2.ShowDialog();
                       }, null);
Run Code Online (Sandbox Code Playgroud)

其中GuiContext是SynContext的存储实例.