2014-07-17 98 views
2

我正在尋找一種方法來抑制HttpModule中的重複請求。不幸的是我不斷收到以下錯誤:我正在尋找一個解決方案,請解釋。限制重複請求

System.ObjectDisposedException: The semaphore has been disposed.

System.ObjectDisposedException: The semaphore has been disposed. at System.Threading.SemaphoreSlim.CheckDispose() at System.Threading.SemaphoreSlim.Release(Int32 releaseCount) at System.Threading.SemaphoreSlim.Release()

我的方法如下。

// Container for semaphores 
private static readonly ConcurrentDictionary<string, SemaphoreSlim> 
SemaphoreSlims = new ConcurrentDictionary<string, SemaphoreSlim>(); 

// Wrapper for getting semaphore 
private static SemaphoreSlim GetSemaphoreSlim(string id) 
{ 
    return SemaphoreSlims.GetOrAdd(id, new SemaphoreSlim(1, 1)); 
} 


private async Task ProcessImageAsync(HttpContext context) 
{ 
    // `hash` is the request path hashed. 
    SemaphoreSlim semaphore = GetSemaphoreSlim(hash); 
    await semaphore.WaitAsync(); 

    try 
    { 

    // Do awaitable task 

    } 
    finally 
    { 
     semaphore.Release(); 
    } 
} 

Dispose()處置HTTP模塊本身的過程中,只叫(由我)。

private void Dispose(bool disposing) 
{ 
    if (this.isDisposed) 
    { 
     return; 
    } 

    if (disposing) 
    { 
     // Dispose of any managed resources here. 
     foreach (KeyValuePair<string, SemaphoreSlim> semaphore in SemaphoreSlims) 
     { 
      semaphore.Value.Dispose(); 
     } 

     SemaphoreSlims.Clear(); 
    } 

    // Call the appropriate methods to clean up 
    // unmanaged resources here. 
    // Note disposing is done. 
    this.isDisposed = true; 
} 
+0

設置一個斷點,以查看您的dispose代碼是如何調用的以及由誰調用的。 – usr

+0

我不得不以某種方式記錄它。拋出錯誤似乎只發生在負載和零星的情況下。 –

回答

4

Apparently, both HttpApplication and HttpModule's are instantiated multiple times.(這樣的設計看起來非常可疑的我。換句話說,在ASP.NET中的設計缺陷。這些情況應該只是單身像大家期待的那樣。)

靜態辭典正在被處置的多個實例處理。

根本不需要處置。當工作進程死亡時,讓操作系統刪除這些資源。

不,你的字典會無限制地增長。

此外,您傳遞給GetOrAdd的信號量實例幾乎總是泄漏而未被處置。

+0

非常感謝。你能否演示一個更好的模式? –

+0

只需刪除配置代碼即可。你想保持應用程序運行期間的數據,所以永遠不要銷燬它。如果你堅持,你可以使用Interlocked.Inc/Dec保留活動模塊實例的引用計數。不過,這很難得到正確的答案。 – usr

+0

啊對,謝謝... 做一些快速內存使用測試它是~156兆字節存儲在字典中的100萬項。我認爲這是合理的,但顯然我想保持最低限度。我會看看聯鎖,但我可能會離開它。 –