C# 如何知道在ASP.NET C中,两个会话是否在浏览器游戏上单击了按钮#

C# 如何知道在ASP.NET C中,两个会话是否在浏览器游戏上单击了按钮#,c#,asp.net,session,browser,synchronization,C#,Asp.net,Session,Browser,Synchronization,两个人在不同浏览器上玩的浏览器游戏有问题。游戏状态由使用游戏类和玩家单击的按钮的会话变量控制。在游戏结束时,玩家有3种选择,要么重新匹配同一玩家,要么找到另一个玩家,要么完全断开游戏。如果玩家断开连接,游戏可以干净地销毁游戏对象并恢复所有会话变量 我遇到的问题是同步玩家选择的其他两个按钮。如果两个玩家都选择了相同的按钮,那么游戏将继续进行。但是,如果一名球员想要复赛,而另一名球员想要重赛,那么不一致的球员必须都找到新球员 我使用了两个会话变量,PlayWithSamePlayer意味着他们希望与

两个人在不同浏览器上玩的浏览器游戏有问题。游戏状态由使用游戏类和玩家单击的按钮的会话变量控制。在游戏结束时,玩家有3种选择,要么重新匹配同一玩家,要么找到另一个玩家,要么完全断开游戏。如果玩家断开连接,游戏可以干净地销毁游戏对象并恢复所有会话变量

我遇到的问题是同步玩家选择的其他两个按钮。如果两个玩家都选择了相同的按钮,那么游戏将继续进行。但是,如果一名球员想要复赛,而另一名球员想要重赛,那么不一致的球员必须都找到新球员

我使用了两个会话变量,PlayWithSamePlayer意味着他们希望与同一个玩家重赛。我还使用continueechoicesmade确保两个玩家选择相同的选项。如果continueechoicesmade为false,则表示两名玩家不一致,并被放回我的游戏经理以搜索其他玩家。我可以找出如何在我的游戏类中使用我的两个玩家同步方法,这样两个玩家的动作都可以被听到。现在,如果我运行这个游戏,当它到达我的方法时,它将作为一个异常出现

我希望在游戏结束时,一个玩家选择一个按钮,浏览器等待另一个浏览器点击一个按钮,然后检查他们按下的按钮是否相同,然后检查是否相同;游戏继续,如果他们点击的内容不同;游戏继续。在玩家单击“重新匹配”或“查找新玩家”后,同步会话变量的最佳方法是什么。下面是我在game类中处理两名玩家的方法,以及我在aspx.cs页面上调用的方法

((Game)Session["Game"]).RoundOverSynchronizing(Session);//when should I call this out? this is not apart of the game class.


    public void RoundOverSynchronizing(HttpSessionState player)
{

    if (((bool)player1["PlayWithSamePlayer"]) == true
    && ((bool)player2["PlayWithSamePlayer"]) == true)
    {
        player1["ContinueChoicesMade"] = true;
        player2["ContinueChoicesMade"] = true;
    }
    else if (((bool)player1["PlayWithSamePlayer"]) == false
  && ((bool)player2["PlayWithSamePlayer"]) == false)
    {
        player1["ContinueChoicesMade"] = true;
        player2["ContinueChoicesMade"] = true;
    }
    else
    {
        player1["ContinueChoicesMade"] = false;
        player2["ContinueChoicesMade"] = false;
    }
}

我认为在这里使用会话不是一个好主意。(我认为您不能/不应该从另一个线程读取会话的数据。也许我错了)
我认为您应该使用至少两种实体将这些数据存储在数据库(SQL/NoSQL)中:

  • 一个有2个SessionId的用于比赛记录
  • 一个是玩家的SessionId和他们的选择
因此,您可以存储他们的选择,并检查他们是否愿意重赛。

假设您有某种轮询或comet解决方案,如果重新匹配条件成功,将创建一个表/游戏室,如果玩家拒绝,将显示一条消息。

如果您想访问共享的数据,您需要使用数据存储(如另一个答案中提到的SQL)也可以将信息存储在应用程序缓存中。在这种情况下,您需要创建一个游戏类来管理整个游戏,然后为单个用户添加/删除会话。

会话数据不共享。使用相同的正确共享-即非会话、非视图状态、非静态-资源来传输此状态,就像在游戏状态的其余部分中一样。也就是说,“继续”游戏与“玩”游戏时做出选择/移动没有什么不同。上面的方法在运行游戏的游戏类中。它需要的参数是将信息发送到游戏类的浏览器会话,然后将其分为两个会话:player1和player2。我发现在检查ContinueChoicesMade会话变量时会感到困惑。只有当两个玩家单击不同的按钮时,才会出现错误。客户端之间不会共享会话数据。我不明白这是怎么回事。。如果有一些神奇的棍棒被使用,那么它应该在上下文中显示。是的,它不是共享的,但我可以测试会话变量是否设置。会话变量定义游戏当前处于的状态。每个浏览器都有自己的会话状态,在该状态下,当会话变量存在时,它将执行游戏,否则游戏将不知道下一步要做什么和去哪里。会话变量只能在具有正确会话ID的浏览器发出的请求中访问。服务器端只能访问播放器1请求中的会话,播放器2也是如此。所以,如果你不打算把这些变量存储在其他地方,你怎么能把它们放到同一个comtext中进行比较呢?关于同步问题,如果你不想使用comet解决方案,你可以在玩家的下一个请求中处理这个问题。我认为“缓存”在这里是不合适的。缓存对于存储可能在别处可用的东西很有用——关键字是may。在非常特别的配置环境之外,可能没有任何保证。使用SQL(或另一种保证持久性的机制)是一种方法。我不明白你在说什么缓存。为什么“可能”它不在缓存中?该术语通常用于指数据可能不总是可用的临时存储(出于各种原因:逐出、传播、非持久性重新启动、作用域/位置、竞争条件等),其主要目的是加速对数据的访问,而不是存储数据。因此,我不会依赖“缓存”来实现这一目的。(不同的缓存(例如,非常特殊的配置)在特定的环境中可能提供也可能不提供更强的保证。):使用应用程序缓存时的模式是在您访问某个项目时确定该项目是否存在于缓存中,如果该项目确实存在,则使用该项目。如果该项不存在,可以重新创建该项,然后将其放回缓存中。此模式确保缓存中始终有最新的数据。-也就是说,一般来说,无法保证应用程序缓存将包含所需的值。是的,我认为作为一种最佳实践,这不是一个明智的选择,甚至在我的建议中,这个想法是不要使用您无法承受损失的信息。谢谢你的链接