コード例 #1
0
        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();
            }
        }