簡體   English   中英

C#偶爾的AccessViolationException

[英]C# Occasional AccessViolationException

我有一個第三方庫,有時會導致AccessViolationException。 我已經標記了罪魁禍首。 我真的很喜歡這種方法優雅地失敗,這樣我的調用代碼可以在短時間內再次嘗試,但此時,這個異常會導致整個應用程序崩潰。

    public static PlayerModel GetModel(int instanceId)
    {
        try
        {
            // New player model.
            PlayerModel model = new PlayerModel();

            // Fill.
            model._flakyLibrary = new FlakyLibrary(instanceId); // **Sometimes crashes**
            model.instanceId = instanceId;

            // Return the new player model.
            return model;
        }
        catch
        {
            // Try again in a bit - the game is not fully loaded.
            return null;
        }
    }

我有一個想法是啟動一個子進程來運行這個邏輯並且如果需要那么優雅地崩潰 - 我不知道如何做到這一點,更不用說有一個進程返回這種對象(我的自定義PlayerModel )到另一個過程。 我已經筋疲力盡地搜索谷歌和Stack Overflow(也許我在問錯誤的問題?)。

非常感謝Theodoros。 我已將以下屬性添加到上述方法中。 現在被抓住了例外。

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]
    [System.Security.SecurityCritical]

PS - 如果有人知道我應該研究什么,我仍然着迷於了解多工藝解決方案? 非常感謝再次。

另一個編輯:我找到了使用多個進程的解決方案:NamedPipeServerStream。

AccessViolationException是一個異常,通常在您的進程嘗試訪問不屬於自己的內存時AccessViolationException (順便說一下, NullReferenceException只是一個低地址的AccessViolationException ,提供不同的名稱,以便提示你是什么原因造成的。)因此,有理由說這或多或少是你程序中發生的事情:a取消引用無效指針(可能是空指針)或超出特定緩沖區邊界的訪問。

如果你沒有弄亂指針,你的代碼不負責解決問題。 您正在調用的構造函數負責執行不安全和無效的操作。 如果您使用的庫是開源的,您可以通過查找上述可疑行為,自己進入並嘗試自行診斷問題。 然后,您可以繼續嘗試修復它(並可能為該庫的開發人員提供修復)。

如果由於任何原因無法完成上述操作,則有一種解決方法。 默認情況下,托管代碼無法捕獲AccessViolationException ,因為它是一個損壞的狀態異常(CSE),但您可以選擇全局(通過應用另一個答案中描述的修復)或每個方法(通過使用[HandleProcessCorruptedStateExceptions]屬性)。

但是,您必須了解所承擔的風險:您的程序將嘗試從損壞的狀態恢復。 如果可以的話,盡量不要使用強迫你這樣做的庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM