2012-12-17 6 views
0

저는 실버 라이트 게임을 디자인하고 있으며 게임 종료 기능을 고수하고 있습니다. 턴 기반 카드 게임이고 WCF Duplex를 사용하고 있습니다. 하지만 finalize 함수를 호출하면 OnFinalized 메시지 앞에 콜백 함수가 OnEndGame 메시지를 수신합니다. 새로운 게임을 시작하기 전에 클라이언트에서 애니메이션을 재생해야합니다. 나는 Thread.Sleep과 Task.Wait 등을 포함하여 많은 것들을 시도했지만 문제를 파악할 수 없었다. EndGame 메소드가 반환되는 데 시간을 할애하려면 어떻게해야합니까?WCF 및 Silverlight의 Thread.Sleep

private void FinalizeGame() 
    { 
     this.GameState = Enums.GameState.Finalize; 

     Task.Factory.StartNew(()=>{ 
      CalculateWinners(); 
      GameSubscriptionManager.Publish(SubscriptionType.GameStream, cb => cb.OnFinalize(this)); 
     }).ContinueWith((antecedent)=>{ 
      EndGame(); 
     }); 
    } 

    private void EndGame() 
    { 
     this.GameState = Enums.GameState.None; 

     Thread.Sleep(5000); 

     GameSubscriptionManager.Publish(cb => cb.OnEndGame(this)); 
     RemovePlayersAndGetWaitingPlayers(); 


     if (PlayingPlayers.Count > 1) 
     { 
      ResetGame(); 
      StartGame(); 
     } 
     else 
     { 
      GameState = GameState.None; 
      GameSubscriptionManager.Publish(cb => cb.OnWaitingForNewPlayers(this)); 
     } 
    } 
+0

어디에서'Finalize' 메서드를 호출하고 메서드 자체는 어디에 있습니까? – sll

+0

게임 결과가 계산되고 새 게임이 시작되어야하는 게임의 마지막 단계입니다. 서비스에서 Finalize 메서드를 호출하여 Aleksandir의 도움을 받아 – Kubi

답변

0

확인. 스레딩이나 작업 중 아무 것도 내 사건을 해결하지 못했기 때문에 약간의 트릭을 만들고 애니메이션을 사용하여 UI 스레드를 점유하고 완성 된 이벤트 핸들러를 사용하여 응용 프로그램의 지연 기능을 만들기로 결정했습니다.

내가 먼저 디스패처에 대해 다음 확장,

public static class Extensions 
{ 
    public static event EventHandler OnCompleted; 

    public static void WaitForFakeAnimation(this Dispatcher dispatcher, TimeSpan timeToWait, EventHandler onCompleted) 
    { 
     Storyboard sb = new Storyboard(); 
     sb.Duration = timeToWait; 
     OnCompleted += onCompleted; 
     sb.Completed += (s,e) => 
     { 
      OnCompleted(sb, null); 
      OnCompleted -= onCompleted; 

     }; 
     sb.Begin(); 
    } 

} 

I의 (a 뷰 모델로 간주 될 수있는) 내 GameManager 클래스에서이 전화 드렸습니다했다

 EventHandler aferAnimation = (s,e) => { 
      lock (syncServiceUpdate) 
      { 
       AddNotification(notification); 
       // MessageBox.Show("after wait"); 

      }; 
     }; 
     this.gamePage.Dispatcher.WaitForFakeAnimation(TimeSpan.FromSeconds(15), aferAnimation); 

어쩌면 보낼 것이다 ref 확장 액션도 있지만 현재이 문제가 해결되었습니다.

나는이뿐만 아니라 다른 사람을 도움이되기를 바랍니다.

0

비동기 방식으로 기다릴 수 있습니다. async target pack for Silverlight with VS2012 또는 VS2010을 잡으십시오. 내가 WCF를 사용한 적이

private async Task EndGame() 
    { 
     this.GameState = Enums.GameState.None; 

     await TaskEx.Delay(5000); 

     GameSubscriptionManager.Publish(cb => cb.OnEndGame(this)); 
     RemovePlayersAndGetWaitingPlayers(); 


     if (PlayingPlayers.Count > 1) 
     { 
      ResetGame(); 
      StartGame(); 
     } 
     else 
     { 
      GameState = GameState.None; 
      GameSubscriptionManager.Publish(cb => cb.OnWaitingForNewPlayers(this)); 
     } 
    } 
1

을,하지만 난 당신이 메시지에 주문 도착하려는 경우 WS-ReliableMessaging을 활성화해야 생각 : 당신은 다음 Thread.sleep를위한 것으로 교체로 TaskEx.Delay를 사용할 수 있습니다. this을 읽어보십시오. 행운을 빕니다.

TaskEx.Delay는 Thread.Sleep보다 훨씬 뛰어나지 만 어느 쪽이든 (거의) 모든 문제에 대한 해결책으로 매우 비참합니다.

+0

콜백에 OnFinalize를 보내 주셔서 감사합니다. 2005 년 2 월 WS-ReliableMessaging 메시지 만이이 끝점에서 처리됩니다. ?????) reliableSession을 내 서비스에 적용하면 오류가 발생합니다. 구성 파일이 아마도 일치하지 않습니다. 지금 해보고 있습니다. – Kubi