我想正確處理包裝在由Visual Studio生成的RCW中的傳統VFP(FoxPro)COM控件。該控件公開了一個我應該調用的Destroy方法,以允許控件正確地自行拆卸。當請求處理COM實例時,在後臺線程上執行控件的方法可能會非常好。 VFP是一個單線程單元模型,所以在調用Destroy時,它應該只添加到VFP執行堆棧中。COM在多線程環境中的處理
調用Destroy理想情況下是正確的,因爲它允許COM實例清理一些資源。我擔心的是,實例化VFP COM控件實際上啓動了一個VFP語言運行時實例,該控件託管在該實例中,並且該實例可能被鎖定(無響應)。這個COM組件在大型企業規模的20年曆史應用程序中公開了功能,並且我看到了.NET線程嘗試調用此控件上的方法的情況,只是在不拋出錯誤的情況下阻止(總是由傳統中的錯誤引起VFP代碼)。這並不經常發生,但它經常足以讓我建立一個實例管理器,該實例管理器在後臺線程中運行VFP COM實例上的方法,並定期檢查該線程是否被阻塞,如果是,則銷燬COM實例和線程,並重新啓動一個新的實例進行監控。
這是處理後臺方法可能執行的線程的正確方法嗎?
我應該試圖通過調用Destroy方法讓COM控件正確拆卸來獲得更好的效果嗎?
if (_vfpThread != null)
{
try
{
if (_vfpThread.IsAlive)
_vfpThread.Abort();
}
catch (ThreadAbortException)
{ }
finally
{
_vfpThread = null;
}
}
if (_vfpInstance != null)
{
Marshal.ReleaseComObject(_vfpInstance);
_vfpInstance = null;
}
我不清楚上面的代碼是用於管理此VFP組件的類的Dispose方法。我當然可以嘗試優雅地關閉VFP線程,但這樣做可能需要一分鐘。 VFP線程使用AutoResetEvent通知主線程它已成功釋放其資源。問題是VFP線程被攻破時會發生什麼? WaitOne在60秒後超時,然後僅中止VFP線程。這對組件的正常關閉/重新啓動是正確的,但對於Dispose方法來說不是很好的做法。 Dispose應該做什麼? – RMart
這是正確的做法。我將重寫代碼,以便嘗試關閉Dispose之外的VFP處理器。這是一個單獨的問題。也感謝您指出愚蠢的ThreadAbortException處理。 – RMart