Seems like the FilterDescriptor is still expecting to be executed from the GUI thread:
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The calling thread cannot access this object because a different thread owns it.
Source=WindowsBase
StackTrace:
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.DependencyObject.GetValue(DependencyProperty dp)
at Telerik.Windows.Data.FilterDescriptor`1.get_FilteringExpression()
at Telerik.Windows.Data.FilterDescriptor`1.CreateFilterExpression(ParameterExpression parameterExpression)
at Telerik.Windows.Data.FilterDescriptorBase.CreateFilterExpression(Expression instance)
at Telerik.Windows.Data.Expressions.FilterDescriptorCollectionExpressionBuilder.CreateBodyExpression()
at Telerik.Windows.Data.Expressions.FilterExpressionBuilder.CreateFilterExpression()
at Telerik.Windows.Data.QueryableExtensions.Where(IQueryable source, CompositeFilterDescriptorCollection filterDescriptors)
at Telerik.Windows.Data.QueryableCollectionView.CreateView()
at Telerik.Windows.Data.QueryableCollectionView.get_QueryableView()
at Telerik.Windows.Data.QueryableCollectionView.CreateInternalList()
at Telerik.Windows.Data.QueryableCollectionView.EnsureInternalList()
at Telerik.Windows.Data.QueryableCollectionView.get_InternalList()
at Telerik.Windows.Data.QueryableCollectionView.InternalIndexOf(Object item)
at Telerik.Windows.Data.QueryableCollectionView.IndexOf(Object item)
at Telerik.Windows.Data.QueryableCollectionView.AdjustCollectionChangedIndex(Object item, Int32 index)
at Telerik.Windows.Data.QueryableCollectionView.AdjustOldIndices(NotifyCollectionChangedEventArgs args)
at Telerik.Windows.Data.QueryableCollectionView.ProcessSynchronousCollectionChanged(NotifyCollectionChangedEventArgs args)
at Telerik.Windows.Data.QueryableCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
at Telerik.Windows.Data.QueryableCollectionView.OnSourceCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
at Telerik.Windows.Data.QueryableCollectionView.Telerik.Windows.Data.IWeakEventListener<System.Collections.Specialized.NotifyCollectionChangedEventArgs>.ReceiveWeakEvent(Object sender, NotifyCollectionChangedEventArgs args)
at Telerik.Windows.Data.WeakEvent.WeakListener`1.Handler(Object sender, TArgs args)
at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
at System.Collections.ObjectModel.Collection`1.Add(T item)
at Novatech.MDLBuilder.TelerikMDIParentWindow.UpdateStatusHistory(String message, Object source, MessageLevel level) in C:\Users\john.kesselman\Source\Repos\MDLBuilder.15\CDBVisualizer\MainWindow\Messages.cs:line 578
at Novatech.MDLBuilder.TelerikMDIParentWindow.ProcessMDLExecutionMessage(String msg, UInt32 line, MessageLevel level, String errorSource, List`1& buildErrors, Boolean& errorRunningMDL, Boolean& messageCreated) in C:\Users\john.kesselman\Source\Repos\MDLBuilder.15\CDBVisualizer\MainWindow\Messages.cs:line 435
at Novatech.MDLBuilder.TelerikMDIParentWindow.<>c__DisplayClass14_2.<performBuild>b__4(String msg, UInt32 line, MessageLevel level) in C:\Users\john.kesselman\Source\Repos\MDLBuilder.15\CDBVisualizer\MainWindow\Messages.cs:line 176
at MDLBuilder.BuildFacility.ModelFileBuilder.BuildModelFile(String pcmName, String fileToCheck, Action`1 logProgress, Action`3 logMessage, Action`2 visualizeProgress, Func`1 checkIfStopped, Boolean remote) in C:\Users\john.kesselman\Source\Repos\MDLBuilder.15\MDLBuilder.BuildFacility\ModelFileBuilder.cs:line 139
at Novatech.MDLBuilder.FileConversionHelper.BuildModelFile(String name, String fileToCheck, Action`1 logProgress, Action`3 logMessage, Action`2 visualizeProgress, Func`1 checkIfStopped, Boolean remote) in C:\Users\john.kesselman\Source\Repos\MDLBuilder.15\CDBVisualizer\FileConversionHelper.cs:line 247
at Novatech.MDLBuilder.TelerikMDIParentWindow.<>c__DisplayClass14_0.<performBuild>b__1() in C:\Users\john.kesselman\Source\Repos\MDLBuilder.15\CDBVisualizer\MainWindow\Messages.cs:line 201
at System.Threading.Tasks.Task`1.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
InnerException:
The code in question adds an item to an ObservableCollection<Message> from non-GUI thread. The grid, however, has a following filter:
new
FilterDescriptor<Message>()
{
FilteringExpression = m =>
(errorToggleButton.IsChecked.HasValue && errorToggleButton.IsChecked.Value && m.Level == MessageLevel.Error)
|| (warningToggleButton.IsChecked.HasValue && warningToggleButton.IsChecked.Value && m.Level == MessageLevel.Warning)
|| (infoToggleButton.IsChecked.HasValue && infoToggleButton.IsChecked.Value && m.Level == MessageLevel.Info)
});
Any ideas?