“要能保证所有该接受该信息的用户都selchat()执行完后,再dr.delete()就ok了”!!!
在同张页面做,用Datatable.检测新消息,如果满足select条件的用户,就显示聊天内容。(selchat()是return聊天内容) 然后执行下拉,最后删掉纪录。代码类似这样protected void Timer1_Tick(object sender, EventArgs e)   //Timer每两秒一次
    {
        foreach (DataRow dr in Ninfo.N_table.Select("(rec='" + seskf() + "' and fser='" + rid() + "') or (rec='" + rid() + "' and fser='" + seskf() + "')"))
        {  
            selchat();           
            ScriptManager.RegisterStartupScript(this, this.GetType(), "sp", "sc()", true);
            dr.Delete();
        }
    }这个方法如果在两张页面用两个Datatable做是没有问题的。 但在一张页面用一个Datatable做,,就出现这样的问题:
例如用户A,用户B。用户A给用户B发送消息的时候,用户A看到了消息,用户B却没看到。 或者用户B看到了,用户A却没看到。就是因为dr.delete() 执行过早。selchat()代码
 private void selchat()
    {
        // sql = "select * from fasong where (fser='" + seskf() + "' and recer='" + rid() + "') or (fser='" + rid() + "' and recer='" + seskf() + "') order by fid asc";
        DataTable dt = sel.chatsel(seskf(), rid());
        string kfid = seskf().ToString();
        string fkid = rid().ToString();
        string Tmpstr = "";        Label1.Text = "";
        if (dt.Rows.Count > 0)
        {
            foreach (DataRow dr in dt.Rows)
            {
                if (dr["iskefu"].ToString() == "0")
                {
                    Tmpstr = rid() + "访客:" + "[" + dr["fsdate"].ToString() + "]\n" + "<br/>" + dr["Content"].ToString() + "<br/><br/>";
                }
                if (dr["iskefu"].ToString() == "1")
                {
                    Tmpstr = "您说:" + "[" + (dr["fsdate"].ToString()) + "]\n" + "<br/>" + dr["Content"].ToString() + "<br/><br/>";
                }
                Label1.Text += Tmpstr;
            }
        }
        string ce = "delete from fkjlcount where (info1='" + rid() + "' and info2='" + Session["kefuing"].ToString() + "') or (info1='" + Session["kefuing"].ToString() + "' and info2='" + rid() + "')";
        m.Sql_Dml(ce);    }