簡體   English   中英

如何確定是否正在卸載C#控件?

[英]How to determine whether a C# control is being unloaded?

在我的C#Windows Forms應用程序中,我有一個用戶控件,該控件包含其他控件並具有自己的邏輯。 其中之一是延遲調用(調用計時器),該延遲調用在用戶完成鍵盤輸入(實時過濾器文本)后執行某些操作。 為此,它訪問其他控件,其中之一是文本輸入控件。 在上次輸入事件后500毫秒調用此方法。

現在,當應用程序終止時延遲調用正在運行時,我遇到了一個問題。 當我輸入一些文本時,等待大約500毫秒(似乎每次都起作用),然后按Alt + F4關閉窗口,應用程序在嘗試訪問文本輸入控件時會拋出NullReferenceException。 當我在上次輸入后立即關閉窗口或在此后一秒或更長時間關閉窗口時,不會發生這種情況。

似乎該控件正在被處置,或者某種方法及其方法無法再訪問子控件。 因此,當控件處於該狀態時(無論該狀態是由誰執行的,無論該對象處於何種狀態),都需要首先停止那些計時器,以便可以安全地放置控件。

我已經嘗試過在OnHandleDestroyed方法(重寫)和Designer生成的Dispose方法的開始處停止計時器。 沒有任何幫助。

在調用base.OnFormClosed()之前,在重寫的OnFormClosed方法中停止計時器時,此過程在常規Forms中可以正常工作。 我只是在用戶控件中找不到合適的事件。

在您的UserControl中嘗試以下操作:

bool isDisposed;
protected override void Dispose(bool disposeManaged)
{
    if(!isDisposed)
    {
        if(disposeManaged)
        {
            //Dispose your timer here
        }
        isDisposed = true;
    }
}

另一種可能是您的一個UI類沒有進行清理。 例如。 它會為事件注冊自己,但在手動處理事件時不會取消注冊。 GC永遠不會收集它,並且下次觸發該事件時,它將嘗試訪問之前在Dispose(...)調用期間設置為null的某些成員。

另一種可能性是您的代碼中存在更復雜的競爭條件,但是從這里很難說。

暫無
暫無

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

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