0

こんにちは私は次のコードを持っています.Pingメソッドを初めて呼び出すと動作しますが、2回目の呼び出しではすでに存在するというエラーで失敗しますはデータテーブルから削除されます。このようにして、現在接続しているユーザーのリストがあります

        public class PokerHost : WebService
    {
    //bool RunningTimmer = true;
   static DataTable table = new DataTable();
   private static readonly TimeSpan UpdateEngineTimerFrequency = TimeSpan.FromSeconds(2);
   private Timer UpdateEngineTimer { get; set; }

   private void MyTimerAction(object state)
  {
    DataTable table = GetTable(); // Get the data table.
    foreach (DataRow row in table.Rows) // Loop over the rows.
    {

            int minused = Convert.ToInt32(row["countdown"]) - 2;
            if (minused >= 0) {
                row["countdown"] = minused;
            }
            else 
            {
            row.Delete();
            }
            table.AcceptChanges();
    }
  }
    static DataTable GetTable()
    {
    table.Columns.Add("gamekey", typeof(string));
    table.Columns.Add("countdown", typeof(int));
    return table;
    }
  protected void Application_Start(object sender, EventArgs e)
  {
    this.UpdateEngineTimer = new Timer(MyTimerAction,
                                       null, /* or whatever state object you need to pass */
                                       UpdateEngineTimerFrequency,
                                       UpdateEngineTimerFrequency);
   }


protected void Application_End(object sender, EventArgs e)
{
    this.UpdateEngineTimer.Dispose();
}



    //--------------------------------------------------------------------------------------------------------------------------------------------------
    //--Only webmethods
    //--------------------------------------------------------------------------------------------------------------------------------------------------

    [WebMethod]
    public string Ping(string gamekey)
    {
    DataTable table = GetTable(); // Get the data table.
    foreach (DataRow row in table.Rows) // Loop over the rows.
    {
            if (Convert.ToString(row["gamekey"]) == gamekey)
            {
                row["countdown"] = 16;
            }
            table.AcceptChanges();
            table.Dispose();
    }
        //make array of current online users
        // need to check with the game and timelimits
        table.AcceptChanges();
        table.Dispose();
        return "PONG";
    }

メソッドが2回目に呼び出されるとすぐに、これを修正するにはどうすればよいですか?

お時間をいただきありがとうございます。このアプリは、ubuntu サーバー上でモノラルで作成および実行されます。

私が得ているエラーはこれです

500 - Internal Server Error
System.Data.DuplicateNameException: A DataColumn named 'gamekey' already belongs to this DataTable.
   at System.Data.DataColumnCollection.RegisterName (System.String name, System.Data.DataColumn column) [0x00000] in <filename unknown>:0 
   at System.Data.DataColumnCollection.Add (System.Data.DataColumn column) [0x00000] in <filename unknown>:0 
4

1 に答える 1

0

tableあなたの問題は、同じ値を変数に数回設定しようとしたことが原因のようです。次のような方法で修正できる場合があります。

static DataTable table = null;

static DataTable GetTable()
{
    if(table == null){
        table = new DataTable();
        table.Columns.Add("gamekey", typeof(string));
        table.Columns.Add("countdown", typeof(int));
    }
    return table;
}

これは正確な解決策ではなく、決してテストされていませんが、うまくいけば、何を試すべきかについてのアイデアを与えるはずです。重要なのは、値をまだ作成しtableていない場合にのみ作成して設定することです(単純なシングルトンパターン)。

PS:必要に応じて、例のようにテーブルにとが含まれているかどうかを確認するのではなく、テーブルに"gamekey"とが含まれているかどうかを確認することもできます。"countdown"null

于 2012-09-06T07:22:12.530 に答える