C# 中止XNA主线程?

C# 中止XNA主线程?,c#,multithreading,xna,C#,Multithreading,Xna,我目前正在将我从XNA的顺序方法(连续调用更新和绘制)创建的游戏转变为多线程方法 我已经成功地将游戏更新和绘图移动到其他任务/线程。我遇到的唯一问题是如何中止主XNA线程(扩展游戏类的类),因为我实际上有空的Update()和Draw()方法 当我尝试通过以下方式中止该线程时: System.Threading.Thread.CurrentThread.Abort(); 作为Game类的Initialize()方法的最后一行,整个应用程序终止。那么,有没有一种方法可以终止XNA的主线程,并且仍

我目前正在将我从XNA的顺序方法(连续调用更新和绘制)创建的游戏转变为多线程方法

我已经成功地将游戏更新和绘图移动到其他任务/线程。我遇到的唯一问题是如何中止主XNA线程(扩展游戏类的类),因为我实际上有空的
Update()
Draw()
方法

当我尝试通过以下方式中止该线程时:

System.Threading.Thread.CurrentThread.Abort();
作为
Game
类的
Initialize()
方法的最后一行,整个应用程序终止。那么,有没有一种方法可以终止XNA的主线程,并且仍然执行游戏窗口?我试图终止此线程的原因是,我不希望它通过执行空的更新/绘制来影响游戏的性能。

好吧,你真的不想中止主线程。该线程拥有XNA用于显示的窗口,您只能在主线程上进行输入(即:
鼠标.GetState
键盘.GetState
,等等)

在其上调用
Abort
相当于引发
ThreadAbortException
,它将冒泡并(在默认的
Program.cs
模板中)清理游戏实例(请参阅
using
语句)

考虑简单地使用主线程作为负责处理
Update
Draw
的线程


但如果您真的下定决心这么做,您可以阻止XNA使用以下代码进行更新:

Application.Idle = null;
(需要引用和使用
System.Windows.Forms

如果您想继续使用
游戏
中的功能,可以使用
Game.RunOneFrame
勾选
。如果您试图取消这些方法,那么就不知道XNA可能会以什么方式爆炸

如果您不使用它们,您需要提供自己的计时代码,您需要调用
FrameworkDispatcher.Update
(音频所需)


无论哪种方式,您都必须找到在主线程上执行输入的方法。Win32消息循环仍将在该线程上运行(或者,更确切地说,是阻塞),因此您需要连接到该线程以进行输入。

如果不需要,主线程将调用
Update
Draw
,您至少可以设置
Enable=Visible=false
@pinckerman仅适用于(
Drawable
GameComponent
s。主回路本身没有这样的选项。@AndrewRussell你是对的,我的错。谢谢。使用XNA主线程的另一个原因是不能从主线程以外的其他线程重置图形设备!我只是在尝试重置时遇到“未定义”异常时才发现这一点。根据MSDN:如果调用重置的线程与用于创建要重置的图形设备的线程不同,则调用重置失败