이 질문은 XNA의 구현에 관한 내용이지만 좀 더 일반적인 C# 포럼에 더 적합하다고 생각합니다. XNA와 함께 TaskFactory를 사용하여 사용자에게 로딩 화면을 표시하면서 추가 리소스를 초기화합니다. 코드는 다음과 유사합니다 : 내가 필요한 시간을 기록했고, 내 메인 창에 초점이 맞춰지면 내 DoSomeFinalizingStuff
방법이 더 오래 걸릴 것루프에서 텍스처에 SetData를 실행할 때 TaskFactory 실행 시간이있는 XNA
Task.Factory.StartNew(() => DoSomeInitialStuff())
.ContinueWith((x) => BuildALevel(x.Result))
.ContinueWith((x) => DoSomeFinalizingStuff(x.Result))
.ContinueWith((x) => NotifyThatIAmFinished());
. DoSomeFinalizingStuff
은 실제로 SetData 메서드를 사용하여 400x400 Texture2D (프로세스에 표시되지 않고 방금 생성 및 수정 됨)에 씁니다. ~ 100ms의
측정 시간의 실제 실행 시간 : 안 포커스 (그리고 표시)로 할 때 5000ms (항상 최대 10K +) AVG 시간 촬영 ~ :
AVG 시간 때 초점 표시에서 촬영 DoSomeFinalizingStuff
. AVG에서의 차이는 50 가지입니다. 나는 정말 골동품입니다. 왜 그렇습니까?
디버거를 실행할 때 모두 모든 체인화 된 작업을 완료하려면 약 1 초가 걸립니다. 디버깅 및 상호 작용없이 실행하면 훨씬 느려지 며, 일반적으로 로딩 화면은 완료 될 때까지 약 10-15 초 동안 거기에 위치합니다.
메인 윈도우에서 초점을 전환 할 때 작업이 더 빠르게 실행되도록 "트리거 할"수 있습니다. 즉시 스위치가 꺼지면 함수가 실행됩니다.
내가 SetData() 호출을 제거하면 성능은 디버깅 할 때와 동일하거나 윈도우가 비활성 상태입니다.
왜 이런 일이 발생하며이 동작을 수정할 수있는 방법이 있습니까?
부수적으로,'x' 주위에 괄호가 필요하지 않습니다. – svick
그 시간 동안 정확히 무슨 일이 일어 났습니까? 작업이 실제로 실행 중이거나 실행 대기 중입니까? 실행중인 경우 정확히 무엇을하고 있습니까? – svick
@svick 작업이 실행되고 기존 Texture2d에 씁니다. 작업은 항상 동일하며 디버깅 할 때 (또는 VS를 포 그라운드로 가져 오는 것과 같은 다른 창을 클릭 할 때) 초간 걸리지 만 상호 작용을하지 않을 때는 최대 15 초가 소요됩니다 (F5 키를 누르고 완료 될 때까지 기다림). 메서드에서 System.Debug 호출을 추가하고 로그에서이 동작을 관찰했기 때문에 알 수 있습니다. – UrbanEsc