我在使用DllImport
訪問它的函數時打了一個第三方C++ dll的調用問題,這個dll是我用類包裝的。我怎樣才能構建一個try-catch-finally塊來最終處理錯誤?
該DLL需要在使用之前打開一個會話,該會話在執行操作時返回用於引用該會話的整數句柄。完成後,必須使用相同的句柄關閉會話。所以我做了這樣的事情:
public void DoWork(string input)
{
int apiHandle = DllWrapper.StartSession();
try
{
// do work using the apiHandle
}
catch(ApplicationException ex)
{
// log the error
}
finally
{
DllWrapper.CloseSession(apiHandle);
}
}
我的問題是,CloseSession()有時會導致DLL的問題拋出Error運行線程時:
System.AggregateException:一個或多個發生錯誤。 ---> System.AccessViolationException:試圖讀取或寫入受保護的 內存。這通常表明其他內存已損壞。
我不知道我能做些什麼來阻止這個錯誤,因爲它似乎是通過以線程方式使用Dll而產生的 - 它應該是線程安全的。但是由於我的CloseSession()函數除了調用該Dll的關閉函數外什麼都不做,因此我沒有太多擺動空間來「修復」任何東西。
但最終結果是會話無法正常關閉。所以當這個過程再次嘗試時,它會遇到一個開放的會話,並不斷拋出新的錯誤。該會議絕對有被關閉。
我不知道如何設計更強大的錯誤處理語句,以確保會話始終關閉?
我想問題是,錯誤應該如何「處理」?如果關閉會話會從第三方代碼中引發錯誤,並且我們無法繼續關閉會話,那麼下一步是什麼?我的意思是,你可以在'finally'裏放置另一個'try/catch',但是你會如何迴應這個錯誤?如果第三方工具不起作用,可以做些什麼? – David
如果這是由線程引起的,那麼也許可以通過在StartSession周圍使用[lock(){}](https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx)語句來解決此問題()和CloseSession()方法調用。 – Serge
@David第三方工具失敗是間歇性的 - 當你第二次嘗試時,它通常起作用。我的實際代碼目前是一個非常糟糕的遞歸和控制流程,試圖確保始終發生。我很討厭添加更多,但如果必須,我必須:( –