2012-05-14 1 views
1

이 질문은 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() 호출을 제거하면 성능은 디버깅 할 때와 동일하거나 윈도우가 비활성 상태입니다.

왜 이런 일이 발생하며이 동작을 수정할 수있는 방법이 있습니까?

+0

부수적으로,'x' 주위에 괄호가 필요하지 않습니다. – svick

+0

그 시간 동안 정확히 무슨 일이 일어 났습니까? 작업이 실제로 실행 중이거나 실행 대기 중입니까? 실행중인 경우 정확히 무엇을하고 있습니까? – svick

+0

@svick 작업이 실행되고 기존 Texture2d에 씁니다. 작업은 항상 동일하며 디버깅 할 때 (또는 VS를 포 그라운드로 가져 오는 것과 같은 다른 창을 클릭 할 때) 초간 걸리지 만 상호 작용을하지 않을 때는 최대 15 초가 소요됩니다 (F5 키를 누르고 완료 될 때까지 기다림). 메서드에서 System.Debug 호출을 추가하고 로그에서이 동작을 관찰했기 때문에 알 수 있습니다. – UrbanEsc

답변

0

동기화 문제가있는 것 같습니다.

원인은 (당신이 TaskScheduler.FromCurrentSynchronizationContext()로 초기화 스케줄러 작업에서 실행하면 너무 그것을해야합니다) ContinueWithTaskScheduler을 상속한다는 것입니다. ContinueWith으로 전화하면 ContinueWith(...,TaskScheduler.Default)이됩니다.

그렇지 않은 경우 디버깅하는 동안 '병렬 작업'및 기타 스레드 관련 창을 살펴보십시오. 문제를 확인하는 데 도움이 될 수 있습니다.

+0

시도했지만 문제가 해결되지 않았습니다. – UrbanEsc

+0

@UrbanEsc 글쎄, 그게 가능한 원인 일 뿐이야. (그리고 보통은 교착 상태를 일으키고, 감속은하지 않습니다.) 어쨌든, 저는 TPL이 여기에 책임이 없다는 것을 99.9999 % 확신합니다. 행운을 빕니다. – Dmitry

+0

나는 비난하고 싶지 않습니다. 당신이 옳을 수도 있습니다. 관찰하고있는 행동이 정확할 수도 있지만, 나는 이유를 이해해야합니다. 메인 스레드 인 게임이 모든 Update() 및 Draw() 호출로 바쁜 것처럼 보이므로 TPL이 내 작업에 낮은 우선 순위를 부여하는 이유가 될 수 있습니까? – UrbanEsc