2017-10-16 25 views
0

嘿,我有一個我創建的應用程序的問題。基本上,在前幾周,我嘗試着手抓住所有第一次機會異常,將它們記錄到數據庫並繼續正常。現在,這裏是我不希望應用程序關閉的貼紙。我只想記錄錯誤並繼續,所以app.quit等不是我正在尋找的。如果它碰到了未處理的異常,我有一個單獨的錯誤處理程序。這很好,但它導致打開多個單詞的實例並導致我的系統因內存不足而崩潰。所以我的問題是沒有人有關於如何最好地實現這個想法或關於如何解決這個問題的任何建議?第一次機會異常錯誤處理導致與多個實例的字內存不足

enter image description here

和代碼是非常簡單的。

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.FirstChanceException += LogException; 




public async Task LogException(string exception) 
{ 
    var word = new Microsoft.Office.Interop.Word.Application(); 
    var winVer = Environment.OSVersion.ToString(); 

    CiteRightException exceptionData = new CiteRightException();   
    exceptionData.stackTrace = exception; 
    exceptionData.windowsVersion = word.Version; 
    exceptionData.windowsVersion = winVer;    

    var content = new StringContent(Json.Encode(exceptionData), 
    Encoding.UTF8, "application/json"); 
    await httpClient.PostAsync("/api/logException", content); 
} 

我一直在使用一個.quit方法試了(沒有停止額外的情況下打開),並認爲它可能是一個線程問題currentThread.join(),但仍然是新的實例被創建。如果我註釋掉第一個輪廓線,一切正常,所以它100%來自這裏。

非常感謝您提前致謝

+0

你有沒有試過從'LogException'方法中退訂它的方法start並在最後一行再次訂閱? –

+0

這個實現的TAP模式的原因/目的是什麼? – DaniDev

+0

「我只想記錄錯誤並繼續」Continue大概意味着您的應用程序(?)只是爲了檢索版本而實例化Word。您可以嘗試將它作爲常量參數傳遞,假設您的應用程序已經與Word進行交互。 – DaniDev

回答

3

您必須處理所有COM對象。

請,請參閱本Disposing of Microsoft.Office.Interop.Word.Application

你的情況:

System.Runtime.InteropServices.Marshal.ReleaseComObject(word) 

PS:做一個嘗試.. finally塊,以防萬一你有其他異常。

+1

布魯諾是對的。您需要處理您創建的單詞實例以解決您遇到的問題,但是,您的整個錯誤處理方法都不正確。作爲一個經驗法則,你絕不應該將堆棧跟蹤返回給客戶端,因爲這揭示了太多的關於coed和黑客的數據可以用來對付你。使用日誌工具(如NLog)並在服務器上記錄異常詳細信息,並將通用錯誤消息傳遞給客戶端。 – Sparrow

相關問題