2010-04-09 147 views
0

對於我們的高級設計項目,我的團隊正在製作一個Silverlight應用程序,該應用程序利用圖論理念並將數據存儲在後端的數據庫中。我們有一種情況,即在圖中的兩個節點之間添加一個鏈接,然後運行分析以重新對我們的節點集羣進行分類。問題是這種重新分類非常複雜,涉及到數據庫的多個查詢和更新,所以如果它的多個實例立即運行,它會很快地破壞數據並破壞(通過嘗試重新插入已經使用的主鍵)。基本上它不是線程安全的,我們正在努力使其安全,這就是我們失敗並需要幫助的地方:)。在Silverlight環境中同步異步請求處理程序

的創建鏈接的功能如下:

private Semaphore dblock = new Semaphore(1, 1); 

// This function is on our service reference and gets called 
// by the client code. 
public int addNeed(int nodeOne, int nodeTwo) 
{ 
    dblock.WaitOne(); 
    submitNewNeed(createNewNeed(nodeOne, nodeTwo)); 
    verifyClusters(nodeOne, nodeTwo); 
    dblock.Release(); 
    return 0; 
} 

private void verifyClusters(int nodeOne, int nodeTwo) 
{ 
    // Run analysis of nodeOne and nodeTwo in graph 
} 

addNeed的所有副本必須等待才能回來另一完成可以執行的第一個。但是,他們似乎都在運行並且在verifyClusters方法中彼此衝突。一種解決方案是強制我們的前端呼叫同步進行。事實上,當我們確保一切正常時,代碼邏輯不會被破壞。但是當它啓動時,我們的應用程序將被部署在一個業務環境中並被內部IT人員使用(或者至少是這個計劃),所以我們會遇到同樣的問題。我們不能強制所有的客戶端在不同的時間提交數據,所以我們真的需要在後端實現同步。感謝您提供的任何幫助,我很樂意提供您可能需要的任何其他信息!

+0

@Eric:您將c#和.net地址標記得太廣泛,唯一具體的標籤就是Silverlight。然而,你的問題與Silverlight很少有關。考慮添加與您的問題更相關的標籤,以使其更容易提供幫助。 – AnthonyWJones 2010-04-10 14:21:55

回答

0

我寫了一系列專門針對這種情況 - 讓我知道,如果這對你的作品(順序異步工作流):

第2部分(有一個鏈接回到第1部分): http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-part.html

Jeremy

+0

嘿,感謝您的鏈接,但我認爲您的文章正在攻擊前端的問題,我們真的需要在後端解決這個問題。我們可以設置我們的add_data方法來按順序進行異步調用,但這隻能解決問題的這一部分。我們確實需要後端智能地處理所有asyc調用,以便多個用戶同時運行不會導致數據完整性丟失。這是我們無法通過客戶端代碼實現的。這就是爲什麼我們試圖使用信號量,我們真的希望有一個簡單的解決方案。感謝您的回覆! – 2010-04-09 20:35:24

0

將您的數據庫更新包裝在一個事務中。必要時升級到桌面鎖