0

我正在设计一款 Silverlight 游戏,但我坚持使用游戏结束功能。这是一款回合制纸牌游戏,我使用的是 WCF Duplex。但是当我调用 finalize 函数时,回调在 OnFinalized 消息之前接收 OnEndGame 消息。在开始新游戏之前,我需要在客户端播放一些动画。我尝试了很多东西,包括 Thread.Sleep 和 Task.Wait 等,但我无法找出问题所在。我应该怎么做才能让 EndGame 方法返回一些时间?

    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));
        }
    }
4

3 回答 3

1

我从未使用过 WCF,但如果您希望消息按顺序到达,我相信您需要启用 WS-ReliableMessaging。试试看这个。祝你好运。

TaskEx.Delay 比 Thread.Sleep 好得多,但是对于(几乎)任何问题的解决方案,任何一个都非常可疑。

于 2012-12-17T21:40:06.333 回答
0

您可以尝试以异步方式等待。使用 VS2012或VS2010获取 Silverlight的异步目标包。然后,您可以使用 TaskEx.Delay 作为 Thread.Sleep 的替换:

    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));
        }
    }
于 2012-12-17T16:10:19.010 回答
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();
    }

}

我从我的 GameManager 类中调用它(可以被视为 ViewModel)

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

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

我可能也会向扩展发送一个 ref Action,但目前这解决了我的问题。

我希望这对其他人也有帮助。

于 2012-12-20T14:47:28.270 回答