2012-03-26 4 views
1

내 게임의 전투기 생성 페이지를 작성하고 있습니다. 페이지는 전투기가 서버에서 다운로드되는 동안 강도 및 기타 속성에 대한 무작위 값으로 UI를 업데이트합니다. 지금까지UI 블록에 여러 비동기 호출로 텍스트 블록 업데이트

코드 :

public partial class FighterGenerationPage : PhoneApplicationPage 
{ 
    Fighter fighter = null; 
    string Code = ""; 
    BackgroundWorker worker; 

    public FighterGenerationPage() 
    { 
     InitializeComponent(); 

     Loaded += new RoutedEventHandler(FighterGenerationPage_Loaded); 

     worker = new BackgroundWorker(); 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    } 

    void FighterGenerationPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     AddFighter(); 
    } 

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     NavigationContext.QueryString.TryGetValue("code", out Code); 

     if ("".Equals(Code)) 
      if (NavigationService.CanGoBack) 
       NavigationService.GoBack(); 

     base.OnNavigatedTo(e); 
    } 

    private void AddFighter() 
    { 
     WebProxy.GetInstance().AddFighter(AddFighter_Handler, Code); 
     worker.RunWorkerAsync(); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Random rand = new Random(); 
     while (fighter == null) 
     { 
      int strength = rand.Next(100); 
      Dispatcher.BeginInvoke(() => { StrValue.Text = Convert.ToString(strength); }); 
      Thread.Sleep(100); 
     } 

     Dispatcher.BeginInvoke(() => { StrValue.Text = Convert.ToString(fighter.Strength); }); 
    } 

    public void AddFighter_Handler(Response response) 
    { 
     #if DEBUG 
     Thread.Sleep(3000); 
     #endif 

     if (response.Status.Error == false) 
     { 
      fighter = response.Fighter; 
     } 
    } 
} 

가이 코드는 거의 내가하고 싶은 일을, 대신 그것을 않는 모든 0.1 초 한 번이 설정 직전에 시작시 다음 여러 번 UI를 업데이트 않는다 그것은 최종 가치 (전투기. 힘)까지.

왜이 동작입니까?

답변

0

는 내가 무슨 일이 일어나고 생각하는 것은 이것이다 :

  1. 당신은 AddFighter_Handler()에 Thread.sleep를 코드가 실행됩니다 것을 의미 디버그에서 실행된다.

  2. AddFighter에 대한 호출이 매우 신속하게 복구됩니다.

  3. AddFighterHandler에서 Thread.Sleep()을 사용하면 실제로 사용자 스레드를 차단하므로 실제로 BeginInvoke에 전달하는 코드를 호출하지 않습니다.

    public void AddFighter_Handler(Response response) 
    { 
        System.Threading.ThreadPool.QueueUserWorkItem(o => { 
        #if DEBUG 
        Thread.Sleep(3000); 
        #endif 
    
        if (response.Status.Error == false) 
        { 
         fighter = response.Fighter; 
        }}); 
    } 
    

    이 당신이 스레드를 차단하지 않도록 할 것 :

다음은이 문제를 해결하기 위해 할 수있는 가장 간단한 일이다. AddFighter_Handler가 동일한 스레드로 실행 얻을 것이라는 점을 깨닫지 못했다,

+0

아하 .. 당신이 달성하려고하는 것을 일시 중지 뭔가를 얻을 수있는 DispatcherTimer 사용을 고려 -

또한 아마하지 않을 권리 일이 .AddFighter (AddFighter_Handler, Code) 호출. 감사! – softarn

관련 문제