我處於清理非託管資源的關鍵部分。爲了解決這個問題,我改變了這個...我需要使用語句來鎖定處理資源,我的自定義解決方案是否健壯?
void SomeMethod()
{
//work
using (var doc = SpreadsheetDocument.Open(results.FileName, true))
{
//use doc.
}
}
這個...
public static readonly object Locker = new object();
void SomeMethod()
{
//work
{//scoping doc
var doc = SpreadsheetDocument.Open(results.FileName, true);
try
{
//use doc
//At some point wrapping a critical section via lock(Locker)
}
finally
{
lock (Locker)
{
if (doc != null) ((IDisposable)doc).Dispose();
}
}
}
}
其中,我相信,是一個醜陋的和脆弱的解決方案。所以,我將其更改爲以下...
public static readonly object Locker = new object();
void SomeMethod()
{
//work
CustomUsingWithLocker(SpreadsheetDocument.Open(results.FileName, true), Locker, doc =>
{
//use doc
//At some point wrapping a critical section via lock(Locker)
});
}
public static void CustomUsingWithLocker<T>(T resource, object locker, Action<T> body)
where T : class, IDisposable
{
try
{
body(resource);
}
finally
{
lock (locker)
{
if (resource != null) resource.Dispose();
}
}
}
此定製解決方案是否健壯?我可以改進嗎?是否保證釋放任何非託管資源,如使用內置語句?
爲什麼在保護文檔不是共享對象時使用鎖定? – Polyfun
在我的customUserWithLocker裏面,doc用於創建一個excel文檔。如果在此期間有不同的文檔正在處理,則會引發超時異常。通過鎖定excel文檔的創建並鎖定dispose調用,超時期望從不會發生。我相信文件流在文檔之間共享。 – Onosa
從ASP.NET或其他服務器技術使用Office Interop是一個糟糕的主意。這些API被編寫用於桌面應用程序,用於自動化Office(一套桌面應用程序)。服務器應用程序在許多方面有所不同,因此在其中使用Office Interop是非常非常糟糕的主意。它也不受Microsoft的支持,並可能違反您的Office許可證。請參閱[服務器端自動化辦公室的注意事項](http://support.microsoft.com/kb/257757) –