2010-07-22 52 views
4

場景:當其他用戶進行更改時刷新Windows程序?

  • 4用戶推出相同的客戶端程序(的WinForms)的單獨的實例是基於待辦事項列表連接到數據庫。
  • 第一個用戶選擇第三個任務列表項目。

如何更新/刷新其他3個用戶屏幕以反映該項目#3不再可用?

我的想法是一張包含上次更新日期時間戳的表。然後一個計時器會每隔幾秒檢查一次,看看是否有任何變化。

UPDATE1:

感謝所有 - 肯定有許多有效的答案。

我去了Icemanind推薦的場景的簡單版本。

+0

知道什麼時候你想讓你的用戶接收更新/刷新很重要。你需要立即或延遲更新嗎?用戶是否正在處理相同的數據部分? 例如,如果您有數千個對象,並且您正在處理實體1,那麼立即知道實體959剛剛更改或僅當您嘗試自己修改959時很重要嗎? 根據這些要求,您可以像在我的回答中一樣使用被動模式,也可以像其他人推薦的那樣使用更加活躍的「推送」系統。 – Matthew 2010-07-22 18:12:04

+0

什麼數據庫以及您如何從該數據庫中讀取? – 2010-07-22 18:17:24

+0

@marc_s - >數據庫現在是MySQL。 – 2010-07-22 19:05:30

回答

1

是的。做到這一點的最好方法是實施「推」式系統。這是如何工作的。每當有人點擊客戶端上的某些內容時,客戶端就會向服務器發送消息。服務器需要接收此信號,然後服務器會向連接到服務器的所有客戶端發送刷新消息。

我不知道您的客戶端或服務器是否已編碼,但您需要在服務器上創建一個線程,以「偵聽」來自客戶端的傳入消息,一旦它接收到消息,將其放入隊列中,收聽更多消息的回報。服務器上的第二個線程需要處理隊列中的消息。

在客戶端,您還需要第二個線程來偵聽來自服務器的傳入消息。收到消息後,它可以處理消息並採取任何必要的操作。

客戶端/服務器和套接字編程上

一個相當不錯的教程可以在這裏找到:http://www.codeproject.com/KB/IP/serversocket.aspx

當然,這是一個指導。您需要根據需要對其進行修改。

希望這是有道理的,祝你好運!

1

您可以實施「推送」系統,當1位用戶更新某些內容時,服務器會向所有連接的客戶端發送更新消息。

1

我會選擇項目上的isDirty時間戳/標誌。無需再次獲取所有項目,也無需創建困難的推送系統。重新閱讀自上次通話以來的所有項目。

2

由於盧卡斯建議你可以實現一個'推'風格的系統,每當一個實體被修改它'推'給其他連接的用戶。這可能有點複雜。使用遺留系統處理這種情況的方式是通過「更改編號」列,但實際上它可以是每次記錄修改時更新的任何內容。

當用戶試圖修改一個實體時,我們查詢數據庫以鎖定該實體,其中「更改號碼」反映了用戶當前擁有的「更改號碼」。

如果鎖定成功,用戶可以更新/刪除實體。完成後,實體上的「保存/提交」和「更改號碼」會增加。

如果他們未能獲得行鎖並且「更改號碼」相同,我們會顯示一條消息,指出他們請求的實體正在被另一個用戶使用。如果「更改號碼」不同,則該消息表示他們必須刷新其視圖。

1

如果您使用SQL Server作爲您的存儲,並使用ADO.NET或其他數據訪問的頂級應用程序,則還應該檢查SQL依賴關係。

基本上,您可以從表創建查詢,並且您可以指示SQL Server通知您該查詢結果中的任何數據是否更改。

參見專題一些介紹文章:

它需要一些初始的設置工作,但優勢巨大這裏是:你會在什麼時候自動通知您感興趣的部分(這是您的查詢結果集的的一部分)更改,您可以對此做出反應。沒有混亂的投票或任何東西....

相關問題