您可以将您上次在客户端更新的日期时间作为请求发送到您的 wcf 服务。但是在服务器端,您会获取在该日期时间之后更新/添加的所有 Persons 并将其作为结果返回。这样,您将只能从服务器端获得修改/添加的Persons。
所以将 lastUpdate 列添加到您的实体 Person。
编辑 1
如果您想服务器更新客户端中的信息而不是客户端从服务器请求消息。
您可以使用它在Web Programming 中的工作方式。
(1)client-side 询问server-side -“嘿,我的最后一次更新是在 2013 年 10 月 2 日 20:00 ”,然后服务器查看数据库 -“2013 年 2 月 20 日 20:00 之后有新闻吗?”如果是:
a) 将消息返回给客户端
如果数据库中没有消息:
b) 他不返回 null,但他执行 Thread.Sleep(somevalue)。他睡着了,然后重复查询数据库并询问“数据库中有消息”。所以这一切都在重复,直到数据库中的消息出现。在 db 中出现消息后,他返回List<data>,该List<data> 在 dateTime 之后更新。在那个客户得到数据后,他回到点 - (1)。
所以你不会向服务器发出很多请求,而是只发出一个请求并等待来自服务器的消息。
注意两件事:
1) 如果客户端等待的时间过长,服务器端会抛出异常(实际上不记得错误代码但现在不重要了),所以你必须在client-side 上捕获这个异常,然后向@ 发出新请求987654329@。另外你必须在server-side上配置,只要你可以等待时间,以尽量减少来自客户端的请求量。
2) 您必须在新线程中运行此 data-updater,而不是在应用程序运行的主线程中。
从代码看它的样子(它可能不起作用,我只是想向您展示逻辑):
服务器端:
public List<SomeData> Updater(DateTime clientSideLastUpdate)
{
List<SomeData> news = new List<SomeData>();
while(true)
{
List<SomeData> news = dbContext.SomeData.Where(e=>e.UpdateDateTime > clientSideLastUpdate).ToList();
if(news.Count()>0)
{
return news;
}
}
}
客户端:
public static void Updater()
{
try
{
var news = someServiceReference.Updater(DateTime clientSideLastUpdate);
RenewDataInForms(news);
Updater();
}
catch(ServerDiesOrWhatElseExcepption)
{
Updater()
}
}
在代码的某处,您在新线程中运行此更新程序
Thread updaterThread = new Thread(Updater());
updaterThread.Start();
编辑 2
如果您想通过一个请求更新所有实体,而不仅仅是SomeData,那么您必须添加 Dto 对象,该对象将包含您想要更新的每个实体的列表。 server-side 将完成并返回此 Dto 对象。
希望对你有帮助。