C# 如何定期调用访问和更新UI控件的函数?

C# 如何定期调用访问和更新UI控件的函数?,c#,asp.net,multithreading,gridview,C#,Asp.net,Multithreading,Gridview,这个web应用程序的基本思想是一个聊天室,显示聊天的GridView应该通过从数据库中选择最新的聊天并存储在DataTable中来刷新,DataTable是GridView的数据源。GridView的标记如下所示:- <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" Width="545px" HeaderStyle-BorderStyle="None" HeaderSt

这个web应用程序的基本思想是一个聊天室,显示聊天的GridView应该通过从数据库中选择最新的聊天并存储在DataTable中来刷新,DataTable是GridView的数据源。GridView的标记如下所示:-

    <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
        Width="545px" HeaderStyle-BorderStyle="None" HeaderStyle-Height="0px">
        <Columns>

            <asp:TemplateField>
                <HeaderStyle Height="0px" Wrap="False" />
                <ItemStyle BackColor="#CCCCCC" ForeColor="Black" Width="394px" 
                    BorderStyle="None" />
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("user") %>'></asp:Label>
                    <asp:Label ID="Label4" runat="server" Text=": "></asp:Label>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("chat") %>'></asp:Label><br />
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("date") %>' Font-Size="Small" ForeColor="Gray"></asp:Label>
                 </ItemTemplate>
            </asp:TemplateField>


        </Columns>
        <HeaderStyle BorderStyle="None" Height="0px" />
    </asp:GridView>
最后,这里是show_chats功能:-

    public void show_chats()
{
        if (GridView1.SelectedIndex >= 0)
        {
            LinkButton ul = (LinkButton)GridView1.Rows[GridView1.SelectedIndex].FindControl("userList");
            string gridViewValue = ul.Text;
            conn.Open();
            SqlDataAdapter sda = new SqlDataAdapter("select * from chats where (chatFrom='" + user + "' and chatTo='" + gridViewValue + "') OR (chatFrom='" + gridViewValue + "' and chatTo='" + user + "')  order by dateTime", conn);
            conn.Close();
            DataTable dt = new DataTable();
            sda.Fill(dt);
            if (dt.Rows.Count == 0)
            {
                txtChat.Text = "No past chats, Type here to get started";
                chats.Clear();
                GridView2.DataSource = chats;
                GridView2.DataBind();
            }
            else
            {
                chats.Clear();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow row = chats.NewRow();
                    row[0] = dt.Rows[i][0].ToString();
                    row[1] = dt.Rows[i][2].ToString();
                    row[2] = dt.Rows[i][3].ToString();
                    chats.Rows.Add(row);
                }
                GridView2.DataSource = chats;
                GridView2.DataBind();
                txtChat.Text = "";
            }

        }

}
现在,我希望定期调用show_chats函数,以便在从包含用户名的GridView1中选择用户时检查是否有新消息

我试着使用线程,但我猜我做得不对,因为它抛出的异常在我不使用线程时不会被抛出。
如果我必须使用线程,请告诉我如何正确使用它。

使用“threading.Thread”独立执行函数,并使用threading.Timer在间隔时间调用该函数

声明线程。计时器:

System.Threading.Timer TimerForXYZ = new System.Threading.Timer(TickForXYZ, null, 0, 1000); // this will call method TickForXYZ after every 1 second
声明线程。线程:

    private void TickForXYZ(object obj)
    {
        Thread myThreadXYZ = new Thread(new System.Threading.ThreadStart(XYZ));
        myThreadXYZ .IsBackground = true;
        myThreadXYZ .Start();
    }
要定期运行的方法:

private void XYZ()
{
    // Your code goes here
    // This function will run after every 1s
}
或者,您可以使用javascript中的计时器调用ajax函数,该函数将加载网格


如果您需要任何帮助,请告诉我。

这实际上与c无关,也与多线程无关。使用Ajax。我不熟悉Ajax,但我想如果你想每X次刷新一部分页面,我会尝试一下Ajax。如果你想刷新洞页面,一个简单的javascript使用SetTimeout就可以了。请求总是来自客户端。事实上,处理这个问题最简单的方法就是从客户端定期刷新-setTimeout很好。如果你想用一些更现代的技术进行更多的实验,signar也可以很好地工作——事实上,它可以让你把它连接到监控聊天室的SqlDependency上——所以你只需要在有实际变化时刷新它。+1对Luaan表示建议signar。我完全忘记了这个选项。我已经很久没有开发web应用程序了。Pravin,这段代码表现得很奇怪。第一次它运行正常,但当我再次运行它时,似乎没有启动函数XYZ。好几次都是这样。然后我清除了浏览器中的cookies并登录了应用程序,它正常工作。但是,我再次运行了这个应用程序,但它不起作用。我想使用javaScript/Ajax,如果你能帮助我,那就太好了。我完全不知道AjAx
private void XYZ()
{
    // Your code goes here
    // This function will run after every 1s
}