0

我试图解决的症状是我的 XNA 应用程序在被最小化后的某些时候不会恢复。我单击最小化按钮,但是当我单击任务栏中的应用程序条目时,应用程序不会恢复 - 它保持最小化。此外,我听到 Windows“叮”的声音效果播放。

如果我反复单击该应用程序,它有时会恢复。我发现如果我的应用程序在其每帧更新调用中的处理时间较短,那么问题就很难重现。如果我添加这个:

 System.Threading.Thread.Sleep(100);

那么申请恢复几乎是不可能的。

我发现如果我删除 Program.Main 上的 [STAThread],它总是可以完美恢复;但是,我使用需要在 Main 方法上设置 STAThread 的 winforms OpenFileDialog,因此我无法摆脱该属性。

关于为什么会发生这种情况的任何想法,以及是否有办法既使用 STAThread 又让应用程序正确恢复?

编辑:在内部,我的应用程序正在使用 ThreadPool.QueueUserWorkItem,而它的存在就是造成这种情况的原因。这是否意味着不应在 STAThread 应用程序中使用 ThreadPool.QueueUserWorkItem?

4

2 回答 2

0

你的意思是 STAThreadAttribute 吗?如果没有,请将其放在 main 方法上。

我使用 STAThreadAttribute 和 ThreadPool.QueueUserWorkItem 并没有这个问题。请注意, Sleep() 专门阻止窗口响应,因为它阻塞了线程。理想情况下,您不应该在游戏的主线程上使用 sleep。

于 2013-08-24T17:52:18.043 回答
0

我使用了不同的方法来解决这个问题。为了防止我的对话框和表单阻塞主线程,我将我的代码放在一个单独的子例程中并启动一个新线程:

Protected Overrides Sub Update(gametime As GameTime)
    ...
    If (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.O)) Then ' load a new object
         If loadthreadrunning = False Then
             loadthreadrunning = True
             Dim thread As New Thread(AddressOf BackgroundLoader)
             thread.SetApartmentState(ApartmentState.STA)
             thread.Start()
         End If
    End If
    ...
End Sub

...
Sub BackgroundLoader()
    Dim fd As New OpenFileDialog
    Dim dlgres As DialogResult
    dlgres = fd.ShowDialog()
    ...
    loadthreadrunning = False
End Sub 

当然,我的代码是用 VB 编写的,但同样的技术也适用于 C#。

于 2017-03-14T05:42:41.963 回答