public void RefreshEntities(object sender)
{
for (; ; )
{
try
{
//refreshing entities will not add new rows added so datagrid needs to be recreated
if (isChanged())
{
Fetch(); //Reset binding or reconstruct data grid
networkEntityTracker = pLCSignilinxEntities.SIGNILINX_NETWORK.ToList().Count;
systemEntityTracker = pLCSignilinxEntities.SIGNILINX_SYSTEM.ToList().Count;
tagEntityTracker = pLCSignilinxEntities.SIGNILINX_TAG.ToList().Count;
}
pLCSignilinxEntities.Refresh(System.Data.Objects.RefreshMode.StoreWins, pLCSignilinxEntities.SIGNILINX_NETWORK);
pLCSignilinxEntities.Refresh(System.Data.Objects.RefreshMode.StoreWins, pLCSignilinxEntities.SIGNILINX_SYSTEM);
pLCSignilinxEntities.Refresh(System.Data.Objects.RefreshMode.StoreWins, pLCSignilinxEntities.SIGNILINX_TAG);
}
catch (Exception ex)
{
MessageBox.Show("Unable to refresh.");
}
Thread.Sleep(300);
}
}
我有一个从数据源拖动的数据网格。 datagrid对应于从SQL数据库创建的实体数据模型的表。数据库中的表定期更改。所以我的程序的目标是在datagrid上显示实时数据。我的程序正在很好地显示除新行或删除行之外的实时数据。当在SQL数据库中的表中插入新行或删除删除行时,数据网格不会更新该行。
上述功能是刷新数据网格的功能。我想我必须编写Fetch()函数来重置绑定或重构数据网格,以便为新添加的行或删除的行更新数据网格。
然后这个函数被后台线程调用为委托,这样数据网格每300毫秒刷新一次。
答案 0 :(得分:0)
首先,更好的方法是Threading.Timer而不是睡眠的无限循环。
http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx
或者,如果您有权访问,则可以设置Sql依赖关系,以便在每次更新,添加或删除数据时触发更改事件。虽然对我来说这从来没有奏效过,但最终我只是自己动手了。但是这里有一些关于sql依赖的东西
http://www.dreamincode.net/forums/topic/156991-using-sqldependency-to-monitor-sql-database-changes/
然后,您只需确保不在内存中缓存任何内容,并且每次都从数据库表重新加载数据。如果您不想拉出整个表(这可能需要一段时间,具体取决于大小),您可以随时设置某种更改表,以跟踪自上次检查后自上次更新,添加或删除的记录。然后只需提取这些记录的数据或从内存中删除已删除的记录。
希望这对你有所帮助。