You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucenenet.apache.org by "Simon Svensson (JIRA)" <ji...@apache.org> on 2012/10/02 08:45:07 UTC
[jira] [Comment Edited] (LUCENENET-511) ObjectDisposedException
thrown when IndexWriter disposed by finalizer
[ https://issues.apache.org/jira/browse/LUCENENET-511?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13467532#comment-13467532 ]
Simon Svensson edited comment on LUCENENET-511 at 10/2/12 5:43 PM:
-------------------------------------------------------------------
Your code does not properly implement the IDisposable pattern. See http://msdn.microsoft.com/en-us/library/system.idisposable.aspx for an example, the Dispose(Boolean) method should only dispose of managed resources when the parameter is true. The problem is caused since garbage collection is nondeterministic; the order of destructor calls are _not guaranteed_.
{code}
if (isDisposing) {
if (_indexWriter != null) {
_indexWriter.Dispose();
_indexWriter = null;
}
}
{/code}
was (Author: sisve):
Your code does not properly implement the IDisposable pattern. See http://msdn.microsoft.com/en-us/library/system.idisposable.aspx for an example, the Dispose(Boolean) method should only dispose of managed resources when the parameter is true. The problem is caused since garbage collection is nondeterministic; the order of destructor calls are _not guaranteed_.
{code}
if (isDisposing) {
if (_indexWriter != null) {
_indexWriter.Dispose();
_indexWriter = null;
}
}
{/code}
> ObjectDisposedException thrown when IndexWriter disposed by finalizer
> ---------------------------------------------------------------------
>
> Key: LUCENENET-511
> URL: https://issues.apache.org/jira/browse/LUCENENET-511
> Project: Lucene.Net
> Issue Type: Bug
> Components: Lucene.Net Core
> Affects Versions: Lucene.Net 3.0.3
> Environment: Windows 7 x64, .NET Framework 4.5
> Reporter: Maximilian Haru Raditya
>
> I'm having an issue of ObjectDisposedException with an error message "Cannot access a closed file." when working IndexWriter.
> I manage to reproduce it when I create a new WPF (4.5) app and install 3.0.3-RC2 from NuGet. I then create a LuceneManager which implements IDisposable, and I create a finalizer for it. I wrap IndexWriter inside it, and dispose it inside Dispose(bool). The implementation code looks like this:
> {code}
> namespace WpfApplication
> {
> using System;
> using System.Collections.Generic;
> using System.IO;
> using Lucene.Net.Analysis.Standard;
> using Lucene.Net.Index;
> using Lucene.Net.Store;
> using Version = Lucene.Net.Util.Version;
> public class LuceneManager : IDisposable
> {
> public static readonly string IndexPath =
> Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Index");
> private IndexWriter _indexWriter;
> private bool _isDisposed;
> public LuceneManager()
> {
> var directory = FSDirectory.Open(IndexPath);
> var analyzer = new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>());
> this._indexWriter = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
> }
> ~LuceneManager()
> {
> this.Dispose(false);
> }
> public void Dispose()
> {
> this.Dispose(true);
> GC.SuppressFinalize(this);
> }
> private void Dispose(bool isDisposing)
> {
> if (!this._isDisposed)
> {
> if (this._indexWriter != null)
> {
> this._indexWriter.Dispose();
> }
> this._indexWriter = null;
> this._isDisposed = true;
> }
> }
> }
> }
> {code}
> And the calling code looks like this:
> {code}
> namespace WpfApplication
> {
> using System.Windows;
> public partial class MainWindow : Window
> {
> public MainWindow()
> {
> this.InitializeComponent();
> }
> private void OnLoaded(object sender, RoutedEventArgs e)
> {
> var lucenceManager = new LuceneManager();
> }
> }
> }
> {code}
> The app run just fine until I close it and it throws ObjectDisposedException as described above.
> The exception details:
> {code}
> System.ObjectDisposedException was unhandled
> HResult=-2146232798
> Message=Cannot access a closed file.
> Source=mscorlib
> ObjectName=""
> StackTrace:
> at System.IO.__Error.FileNotOpen()
> at System.IO.FileStream.get_Length()
> at Lucene.Net.Store.NativeFSLock.Release()
> at Lucene.Net.Index.IndexWriter.CloseInternal(Boolean waitForMerges)
> at Lucene.Net.Index.IndexWriter.Dispose(Boolean disposing, Boolean waitForMerges)
> at Lucene.Net.Index.IndexWriter.Dispose(Boolean waitForMerges)
> at Lucene.Net.Index.IndexWriter.Dispose()
> at WpfApplication.LuceneManager.Dispose(Boolean isDisposing)
> at WpfApplication.LuceneManager.Finalize()
> InnerException:
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira