0

我正在开发一个游戏。在这个游戏中玩家可以点击一个按钮攻击一个boss,他必须等待5分钟才能看到攻击的结果。攻击将在5分钟后执行。
所以这是我的尝试:这是单击按钮时调用的函数:

public static void InsertNewWaitingAttack(string attacker_id, string boss_id, DateTime  start, DateTime done)
{
    string sql = "INSERT INTO WaitingAttacks (AttackerID,BossID,AttackTime,DoneTime) VALUES (@A_ID,@B_ID,@Start,@Done); ";
    sql += "WAITFOR DELAY '000:05:00'; ";
    sql += "INSERT INTO BossAttacks (AttackerID,BossID,AttackTime,Damage) VALUES (@A_ID,@B_ID,@Start,@Damage); ";
    sql += "DELETE FROM WaitingAttacks WHERE AttackerID=@A_ID AND AttackTime=@Start;";
    SqlConnection sc = new SqlConnection(conString);
    using (SqlCommand cmd = new SqlCommand(sql, sc))
    {
        cmd.Parameters.AddWithValue("A_ID", attacker_id);
        cmd.Parameters.AddWithValue("B_ID", boss_id);
        cmd.Parameters.AddWithValue("Start", start);
        cmd.Parameters.AddWithValue("Done", done);
        cmd.Parameters.AddWithValue("Damage", 500);
        sc.Open();
        cmd.ExecuteNonQuery();
        sc.Close();
    }
}

但是当我调用这个函数时,我得到了以下错误:

超时已过。在操作完成之前超时时间已过或服务器没有响应。

编辑:为了澄清我的问题,这是一个 asp.net 应用程序。该解决方案应考虑服务器应为多个客户端提供服务。
如果用户在执行攻击之前进入“结果页面”,他将看到执行攻击的倒计时。(这意味着应该始终可以访问攻击的开始时间。)
编辑#2:
问题是仍然相关。我还没有找到任何解决方案。

4

2 回答 2

4

如何在您的代码中设置一个 5 分钟后触发的计时器并在INSERT没有的情况下执行WAITFOR?这样,程序会保持响应,您仍然会遇到延迟。

我建议您使用System.Timers.Timer它,因为它在单独的线程中运行,也可以更轻松地配置为“一次性”计时器。


另一种使处理多个boss附加更容易的可能方法是创建一个待处理的“boss攻击”列表,并在该列表上使用一个线程计时器,如下所示:

private class BossAttack
{
    public DateTime AttackTime;
    //... Other properties
}

List<BossAttack> pendingAttacks = new List<BossAttack>();

// Adding a boss attack
lock (pendingAttacks)
{
    pendingAttacks.Add(new BossAttack()
    {
         AttackTime = DateTime.Now;
         ...
    }
}

计时器可以每秒运行一次,获取所有 5 分钟以上的 Boss 攻击并处理它们:

var currentAttacks = (from a in pendingAttacks where (DateTime.Now - a.AttackTime).TotalMinutes() >= 5 select a);
foreach (var currentAttack in currentAttacks)
    //...
于 2013-11-11T10:41:07.367 回答
-2

您可以异步尝试System.Threading.Sleep为什么在这里看到答案:

异步线程.Sleep()

于 2013-11-11T10:38:47.380 回答