虽然这个问题是关于 XNA 中的实现,但我认为它更适合更通用的 C# 论坛。我正在使用带有 XNA 的 TaskFactory 来初始化其他资源,同时向用户呈现加载屏幕。代码与此类似:
Task.Factory.StartNew(() => DoSomeInitialStuff())
.ContinueWith((x) => BuildALevel(x.Result))
.ContinueWith((x) => DoSomeFinalizingStuff(x.Result))
.ContinueWith((x) => NotifyThatIAmFinished());
我已经记录了所需的时间,DoSomeFinalizingStuff
当我的主窗口处于焦点时,我的方法将花费更长的时间。DoSomeFinalizingStuff
实际使用SetData方法写入一个400x400的Texture2D(过程中不显示,只是创建和修改)。
对焦且可见时的 AVG 时间:~5000 毫秒(有时高达 10k+) 不对焦(且不可见)时的平均时间:~100 毫秒
测量的时间是 的实际执行时间DoSomeFinalizingStuff
。那是 AVG 的 50 倍差异,我非常好奇,为什么会这样。
运行调试器时,所有链接的任务都需要大约一秒钟才能完成。在没有调试且没有交互的情况下运行时速度会慢很多,通常加载屏幕会在那里停留大约 10-15 秒,直到完成。
当我将焦点从主窗口移开时,我可以“触发”任务以更快地执行。一旦我切换出去,该功能就会被执行。
如果我删除 SetData() 调用,性能与调试或 Windows 不活动时相同。
为什么会发生这种情况,有没有办法修改这种行为?