クライアント側での最終更新の dateTime をリクエストとして wcf サービスに送信できます。Persons
しかし、サーバー側では、その dateTime の後に更新/追加されたものをすべて取得し、結果として返します。このようにPerson
して、サーバー側から変更/追加された のみを取得します。
したがって、エンティティに lastUpdate 列を追加しますPerson
。
編集1
クライアントではなくクライアントの情報をサーバーで更新する場合は、サーバーからのニュースを要求します。
のような使い方ができますWeb Programming
。
(1)client-side
質問server-side
- 「ねえ、私の最後の更新は 2013 年 10 月 2 日 20:00 でした」、サーバーは DB を調べます - 「2013 年 10 月 2 日 20:00 以降のニュースですか?」もし、そうなら:
a) ニュースをクライアントに返す
DB にニュースがない場合:
b) 彼は null を返しませんが、Thread.Sleep(somevalue) を返します。彼は寝てから、db へのクエリを繰り返し、「db にニュースがあります」と尋ねます。したがって、DB のニュースが表示されるまで、すべてが繰り返されます。db にニュースが表示List<data>
された後、dateTime の後に更新された を返します。そのクライアントがデータを取得した後、ポイント (1) に戻ります。
したがって、サーバーに多くのリクエストを行うのではなく、1 つのリクエストのみを行い、サーバーからのニュースを待ちます。
2 つのことに注意してください。
1) クライアントの待機時間が長すぎると、サーバー側で例外がスローされるため (実際のエラー コードは覚えていませんが、今は重要ではありません)、この例外をキャッチしてclient-side
に新しいリクエストを作成する必要がありserver-side
ます。また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
1 つの要求ですべてのエンティティを更新する場合SomeData
は、更新可能にするすべてのエンティティのリストを含む Dto オブジェクトを追加する必要があります。はserver-side
完了し、この Dto オブジェクトを返します。
それが役に立てば幸い。