private void Walk(object state) { try { if (_items == null) { _items = new Queue <DicomItem>(); BuildWalkQueue(_dataset); _walker.OnBeginWalk(this, NextWalkItem); } DicomItem item = null; while (_items.Count > 0) { item = _items.Peek(); if (item is DicomElement) { if (!_walker.OnElement(item as DicomElement)) { return; } } else if (item is DicomFragmentSequence) { if (!_walker.OnBeginFragment(item as DicomFragmentSequence)) { return; } } else if (item is DicomFragmentItem) { if (!_walker.OnFragmentItem((item as DicomFragmentItem).Buffer)) { return; } } else if (item is EndDicomFragment) { if (!_walker.OnEndFragment()) { return; } } else if (item is DicomSequence) { if (!_walker.OnBeginSequence(item as DicomSequence)) { return; } } else if (item is BeginDicomSequenceItem) { if (!_walker.OnBeginSequenceItem((item as BeginDicomSequenceItem).Dataset)) { return; } } else if (item is EndDicomSequenceItem) { if (!_walker.OnEndSequenceItem()) { return; } } else if (item is EndDicomSequence) { if (!_walker.OnEndSequence()) { return; } } _items.Dequeue(); } _walker.OnEndWalk(); _items = null; _async.Set(); } catch (Exception e) { try { _walker.OnEndWalk(); } catch { } _exception = e; _items = null; _async.Set(); } }