2011-02-07 82 views
0

在asp.net中有沒有一種方法可以確保某個線程的子程序不會同時運行兩次,不管是什麼?asp.net global synclock object

代碼我現在已經是

Public Class CheckClass 
ReadOnly Property CheckSessionsLock As Object 
    Get 
     If HttpRuntime.Cache("CheckSessionsLock") Is Nothing Then HttpRuntime.Cache("CheckSessionsLock") = New Object 
     Return HttpRuntime.Cache("CheckSessionsLock") 
    End Get 
End Property 
Sub TryThreads() 
    Dim thread = New Thread(AddressOf TryLock) 
    thread.Priority = ThreadPriority.Lowest 
    thread.Start() 
End Sub 
Sub TryLock() 
    SyncLock CheckSessionsLock 
     DoTrace("entered locker") 
     For x = 0 To 10000 
     Next 
     DoTrace("exiting locker") 
    End SyncLock 
    DoTrace("exited locker") 
End Sub 
End Class 

,如果我在每一頁上運行該代碼,然後幾次代碼重疊。代碼中的DoTrace函數只是將消息寫入表中。

表中的消息應該一次又一次地按順序出現(進入,退出,退出),但實際上它們不會。我得到像進入,退出,進入,退出,退出...

這意味着,synclock是不完整的。真的嗎?

如果是這樣,我們如何在代碼塊,跨請求和跨會話實現一個完整的synclock?

編輯:我需要這個鎖,因爲真正的代碼將發送電子郵件,根據數據庫中的郵件類型列表。在發送每種郵寄類型之後,將其標記,然後繼續進行下一次郵寄。我不能在處理中,另一個線程應該看到這封郵件爲未處理。

請指教

回答

2

,而不是讓你考慮使用一個靜態變量使用的httpRuntime緩存?

就像一個說明(它可能有助於解釋爲什麼你想要這個功能),如果你的網站只能一次運行一次,你的網站將不會是非常可擴展的。

+0

你好謝謝。是的,我試過了。請參閱http:// stackoverflow。COM /問題/ 4851591/ASP淨多線程與 - 的SyncLock。還編輯了我的問題以包含推理。謝謝。 – 2011-02-07 14:39:30

1

在C#(對不起,不知道VB語法)我用這個:

private static readonly object Padlock = new object(); 
  • 這是一個領域,而不是一個性質,
  • 它是靜態的(在VB中,這是 「共享」如果我沒有弄錯),所以它在整個應用程序中都是一樣的
  • 一旦你使用這個類,它就被初始化一次,而不是當你明確地使用該字段時。

隨着你的財產/緩存的版本,你可以有兩個線程試圖獲得鎖定對象和每創建一個不同的一個:

  • 線程1個檢查緩存並沒有找到對象
  • 線程1停放
  • 線程2個檢查緩存,不找對象
  • 線程2創建對象並緩存它,從屬性再次返回檢索它
  • 線程1繼續
  • 線程1創建一個新對象,並對其進行緩存,再次檢索它,並返回一個不同的鎖對象比線程2使用
  • 任何進一步的線程將使用線程的鎖對象1