2017-01-30 2 views
0

So wie der Titel sagt, ich weiß nicht, warum es diese "ObejectDisposedException" gibt. Es tritt auf, wenn der Download während des letzten Aufrufs von "OnDownloadUpdated (..)" beendet wurde.ObjectDisposedException, aber warum und was ist entsorgt?

Die Zeile "this.Invoke (..)" löst die Ausnahme aus.

ChromiumWebBrowser browser; 

    public frmRocketPluginDownload() 
    { 
     InitializeComponent(); 

     var settings = new CefSettings(); 
     settings.BrowserSubprocessPath = @"x86\CefSharp.BrowserSubprocess.exe"; 


     Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null); 

     browser = new ChromiumWebBrowser(""); 
     browser.Dock = DockStyle.Fill; 
     browser.AddressChanged += Browser_AddressChanged; 
     browser.DownloadHandler = this; 


     panelBody.Controls.Add(browser); 
    } 


    public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      if (downloadItem.PercentComplete == 100) 
      { 
       this.Show(); 
      } 
     }); 
    } 

Antwort

0

Es ist Race-Bedingung. Wenn das Formular während OnDownloadUpdated geschlossen wird (von dem ich annehme, dass es von einem anderen Thread aufgerufen wird), endet die Operation als erstes: Form disposing oder OnDownloadUpdated. Um diese Überprüfung im Form.Closing-Ereignis zu verhindern, wenn Ihre Methode beendet wurde, setzen Sie Closing.Cancel andernfalls auf "true", um zu verhindern, dass das Formular geschlossen wird.

+0

Das Formular ist während des Downloads versteckt und ich schließe es nirgends in meinem Code, also denke ich, das ist nicht das Problem. –

+0

Wenn die Zeile der Ausnahme "this.Invoke (..)" lautet, bedeutet dies, dass Ihr Formular entsorgt wurde. Jetzt müssen Sie herausfinden, warum es entsorgt wurde. Welches Objekt in der Fehlerzeile ist, die die Exception auslöst, hat die Methode .Dispose() aufgerufen. Versuchen Sie nicht, Ihr Formular während des Downloads zu verstecken und ich nehme an, Sie werden schnell feststellen, ob das Formular das Problem ist oder nicht. – Wolf5

+0

Danke. Durch Entfernen des "this.visible = false" wurde es gelöst, aber ich verstehe nicht wirklich, warum diese Zeile so problematisch war. –

Verwandte Themen