對於我們的高級設計項目,我的團隊正在製作一個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人員使用(或者至少是這個計劃),所以我們會遇到同樣的問題。我們不能強制所有的客戶端在不同的時間提交數據,所以我們真的需要在後端實現同步。感謝您提供的任何幫助,我很樂意提供您可能需要的任何其他信息!
@Eric:您將c#和.net地址標記得太廣泛,唯一具體的標籤就是Silverlight。然而,你的問題與Silverlight很少有關。考慮添加與您的問題更相關的標籤,以使其更容易提供幫助。 – AnthonyWJones 2010-04-10 14:21:55