1

この質問は XNA での実装に関するものですが、より一般的な C# フォーラムに適していると思います。XNA で TaskFactory を使用して、ロード画面をユーザーに表示しながら追加のリソースを初期化しています。コードは次のようになります。

        Task.Factory.StartNew(() => DoSomeInitialStuff()) 
          .ContinueWith((x) => BuildALevel(x.Result)) 
          .ContinueWith((x) => DoSomeFinalizingStuff(x.Result)) 
          .ContinueWith((x) => NotifyThatIAmFinished()); 

必要な時間をログに記録しましたDoSomeFinalizingStuff。メイン ウィンドウにフォーカスがあると、メソッドに時間がかかります。DoSomeFinalizingStuffSetData メソッドを使用して、実際には 400x400 の Texture2D (プロセスには表示されず、作成および変更されたばかり) に書き込みます。

AVG 焦点が合っていて表示されているときの所要時間: ~5000ms (最大 10k+ の場合もある) AVG 焦点が合っていない (および表示されていない) ときの所要時間: ~100ms

計測した時間は の実際の実行時間ですDoSomeFinalizingStuff。それは AVG で 50 倍の違いです。私はかなり好奇心旺盛です。

デバッガーを実行すると、チェーンされたすべてのタスクが完了するまでに約 1 秒かかります。デバッグや対話なしで実行すると、はるかに遅くなります。通常、読み込み画面は完了するまで約 10 ~ 15 秒間そこに留まります。

メインウィンドウからフォーカスを切り替えると、タスクをより速く実行するように「トリガー」できます。切り替えるとすぐに、関数が実行されます。

SetData() 呼び出しを削除すると、パフォーマンスは、デバッグ時またはウィンドウが非アクティブなときと同じになります。

なぜこれが起こっているのですか?この動作を変更する方法はありますか?

4

1 に答える 1

0

同期に問題があるようです。

考えられる原因の 1 つは、ContinueWith継承するTaskSchedulerことです (スケジューラが初期化されたタスクから実行すると、それも継承さTaskScheduler.FromCurrentSynchronizationContext()れます)。このように電話してみてくださいContinueWith: ContinueWith(...,TaskScheduler.Default)

そうでない場合は、デバッグ中に「並列タスク」やその他のスレッド関連のウィンドウを確認してみてください。問題の特定に役立つ場合があります。

于 2012-05-14T10:54:42.370 に答える