1

虽然这个问题是关于 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 不活动时相同。

为什么会发生这种情况,有没有办法修改这种行为?

4

1 回答 1

0

看起来你有一个同步问题。

一个可能的原因是ContinueWith继承TaskScheduler(如果你从一个用它初始化的调度程序的任务中运行TaskScheduler.FromCurrentSynchronizationContext()它也会有它)。试着这样称呼你ContinueWithContinueWith(...,TaskScheduler.Default).

如果不是这种情况,请尝试在调试期间查看“并行任务”和其他与线程相关的窗口。它可能会帮助您识别问题。

于 2012-05-14T10:54:42.370 回答