我们正在C#中开发一个多线程游戏引擎,并且我们遇到了需要STAThread属性(或手动将我们的线程设置为STA)以启用拖动的问题以及支持(AllowDrop不能在没有STA的情况下设置)。但是,当我们启用STA并且更新方法比draw方法花费的时间更长(如下所示)时,窗口不会再正常工作 - 当它在任务栏中单击时,它不会像您期望的那样最小化和最大化它。不同系统的确切行为是不同的,我猜想这里会出现某种竞争条件。当使用STA和线程花费太长时间表单行为异常
下面是我们的测试代码:
[STAThread]
public static void Main()
{
Form form = new Form();
form.Show();
Barrier barrier = new Barrier(2);
Thread updateThread = new Thread(() => {
while (true)
{
barrier.SignalAndWait();
Thread.Sleep(30); //Update
barrier.SignalAndWait();
}
});
updateThread.Start();
while (true)
{
barrier.SignalAndWait();
Thread.Sleep(15); //Draw
barrier.SignalAndWait();
Application.DoEvents();
}
}
嗯,我想我们会先尝试摆脱Barrier.SignalAndWait,然后使用单独的线程来运行应用程序。我们必须尝试在事件循环运行时DirectX/OpenGL是否可以呈现。否则,我们会尝试你的方法。只要我们完成了我们的测试,我会尽快接受你的回答(即可能在今天晚上)。 – georch
好的,我们现在使用单独的线程进行更新,绘制和DoEvents。这是更简单的解决方案,它还允许我们进行需要STAThread的其他调用(如Cursor.Hide和Cursor.Show,有时需要在运行时调用Cursor.Hide和Cursor.Show,以及将来调用其他调用)。非常感谢您的帮助! – georch