Добавление в наблюдаемую коллекцию с альтернативным потоком - PullRequest
0 голосов
/ 20 сентября 2011

Я добавляю к наблюдаемой коллекции в альтернативном потоке, и эта коллекция связана с сеткой данных из wpftoolkit.

Когда происходит такое событие, oncollectionoted вызывается через основной поток графического интерфейса.

Проблема, которую я вижу, заключается в том, что большую часть времени приложение будет выдавать:

System.ArgumentOutOfRangeException было не обработано Сообщение = Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс Источник = mscorlib ParamName = индекс Трассировки стека: в System.ThrowHelper.ThrowArgumentOutOfRangeException () в System.Collections.Generic.List 1.get_Item(Int32 index) at System.Collections.ObjectModel.Collection 1.System.Collections.IList.get_Item (Int32 index) в System.Windows.Data.ListCollectionView.InternalItemAt (индекс Int32) в System.Windows.Controls.VirtualizingStackPanel.CleanupContainers (Int32 firstViewport, ItemsControl itemsControl) в System.Windows.Controls.VirtualizingStackPanel.MeasureOverride (ограничение размера) в Microsoft.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride (ограничение размера) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ Примитивы \ DataGridRowsPre: 109 в System.Windows.FrameworkElement.MeasureCore (Доступный размер) в System.Windows.UIElement.Measure (Доступный размер) в System.Windows.ContextLayoutManager.UpdateLayout () в System.Windows.ContextLayoutManager.UpdateLayoutCallback (Object arg) в System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks () в System.Windows.Media.MediaContext.RenderMessageHandlerCore (Object resizedCompositionTarget) в System.Windows.Media.MediaContext.RenderMessageHandler (Object resizedCompositionTarget) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler) в System.Windows.Threading.DispatcherOperation.InvokeImpl () в System.Threading.ExecutionContext.runTryCode (объект userData) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (код TryCode, код возврата CleanupCode, объект userData объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Windows.Threading.DispatcherOperation.Invoke () в System.Windows.Threading.Dispatcher.ProcessQueue () в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler) в System.Windows.Threading.Dispatcher.InvokeImpl (приоритет DispatcherPriority, время ожидания TimeSpan, метод Delegate, аргументы объекта, логическое значение isSingleParameter) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) в MS.Win32. UnsafeNativeMethods.DispatchMessage (MSG & msg) в System.Windows.Threading.Dispatcher.TranslateAndDispatchMessage (MSG & msg) в System.Windows.Threading.Dispatcher.PushFrameImpl (фрейм DispatcherFrame) в System.Windows.Application.RunInternal (окно окна) в Apollo.App.Main () в F: \ Workspaces \ BVS \ BVS \ Apollo \ Apollo \ obj \ Debug \ App.g.cs: строка 0

Есть мысли о том, откуда это может быть?Вот онколлекционный измененный код:

protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        using (BlockReentrancy())
        {
            KeyValuePair<NotifyCollectionChangedEventHandler, CollectionChangedEventData>[] handlers = _collectionChangedHandlers.ToArray();

            if (handlers.Length > 0)
            {
                foreach (KeyValuePair<NotifyCollectionChangedEventHandler, CollectionChangedEventData> kvp in handlers)
                {
                    if (kvp.Value.Dispatcher == null)
                    {
                        kvp.Value.Action(e);
                    }
                    else
                    {
                        kvp.Value.Dispatcher.Invoke(kvp.Value.Action, DispatcherPriority.DataBind, e);
                    }
                }
            }
        }

    }

1 Ответ

0 голосов
/ 20 сентября 2011

В верхней части этой трассировки стека указывается, что что-то идет не так в обычном List<> в ListCollectionView.

Возможно, вам следует взглянуть на код, который привязан к SelectedItem et al.

...