我們正在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