我试图制作一个跨平台的WinForms软件,它内部有一个GUI和一个3D窗口。目前,我有两个选项卡的TabControl,第二个需要包含GLControl(3D窗口)。但是,当我切换到第二个选项卡时,程序在GLControl加载时挂起,大概是因为它们在同一个线程中。用C#,WinForms和OpenTK异步加载GLControl
我试图用一个BackgroundWorker这样解决的:
private void onTabSwitch(object sender, EventArgs e)
{
if (tabControl.SelectedIndex == 1)
if (area3D == null)
this.worker.RunWorkerAsync();
}
...
...
...
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
area3D = new GLControl();
area3D.Load += new EventHandler(area3D_Load);
area3D.Paint += new PaintEventHandler(area3D_Paint);
area3D.BackColor = Color.Black;
area3D.Size = new Size(438, 435);
area3D.Location = new Point(200, 0);
this.Invoke((MethodInvoker)delegate
{
secondTab.Controls.Add(area3D); // runs on UI thread
});
}
但它仍然挂起,因为第二个选项卡仍是主要的GUI线程。我该如何解决这个问题?底线,我需要一个3D窗口在另一个选项卡,将异步加载,或只是不会导致我的程序挂起。