Doesn't handle multi threads properly
There is a bug in the charts databinding to a observable collection and using EnableCollectionSynchronization - which enables updating the collection from another thread without having to call the dispatcher. This works fine binding the list to a standard wpf datagrid, but the RaisePropertyChange throws the below exception when the collection is bound to a chart and ListenForPropertyChanges is set to true. The chart is probably not locking the collection as required to access.
System.InvalidOperationException
HResult=0x80131509
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 Syncfusion.UI.Xaml.Charts.ChartSeriesBase.SetIndividualPoint(Int32 index, Object obj, Boolean replace)
at Syncfusion.UI.Xaml.Charts.ChartSeriesBase.OnDataCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.SetItem(Int32 index, T item)
SIGN IN To post a reply.
5 Replies
MK
Muneesh Kumar G
Syncfusion Team
February 28, 2019 01:07 PM UTC
Hi Tom,
Greetings, we have analyzed your query and you can resolve this by using Dispatcher as per the below code snippet.
Code snippet
|
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Dispatcher.Invoke(() =>
{
EditTheCollection();
});
}
public void EditTheCollection()
{
viewModel.Data[0].YValue=10;
}
}
public class Model :INotifyPropertyChanged
{
public double XValue { get; set; }
private double yValue;
public double YValue
{
get { return yValue; }
set { yValue = value; OnPropertyChanged("YValue"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
public class ViewModel
{
public ViewModel()
{
GenerateData();
}
private static object _lock = new object();
public void GenerateData()
{
Data = new ObservableCollection<Model>();
Random rd = new Random();
for (int i = 0; i < 6; i++)
{
Data.Add(new Model()
{
XValue = i,
YValue = rd.Next(0, 50)
});
}
BindingOperations.EnableCollectionSynchronization(Data, _lock);
}
private ObservableCollection<Model> data;
public ObservableCollection<Model> Data
{
get { return data; }
set { data = value; }
}
} |
Please refer below link for more details.
Hope it helps you.
Thanks,
Muneesh Kumar G.
TO
Tom
February 28, 2019 06:18 PM UTC
Yes but the point is that using EnableCollectionSynchronization is meant to alleviate the need to call the Dispatcher. For example I might update my collection 10 times elsewhere and now everytime I would have to add the dispatcher just so the chart works. If it was bound to a wpf datagrid instead this isn't needed so somewhere the chart is not handling the synchronization context correctly.
MK
Muneesh Kumar G
Syncfusion Team
March 1, 2019 12:35 PM UTC
Hi Tom,
We have analyzed the reported problem with our source, it occurs due to non-UI thread trying to access the UI thread in our source.
So, we recommend, you to use the solution provided in our previous update.
Thanks,
Muneesh Kumar G.
Hi Tom,We have analyzed the reported problem with our source, it occurs due to non-UI thread trying to access the UI thread in our source.So, we recommend, you to use the solution provided in our previous update.Thanks,Muneesh Kumar G.
I'm also suffering from this inconsistent behavior compared to e.g. the data grid. I would call it a bug. Why can't it work in the same fashion as for the data grid?
Regards,
Marcus
MK
Muneesh Kumar G
Syncfusion Team
March 28, 2019 11:21 AM UTC
Hi Marcus,
We are unable to get exact data update handling in data grid. But based on our source analysis, whenever you update your UI elements from a thread other than the main thread, you need to use Dispatcher.Invoke. Please check the below link for more details.
Regards,
Muneesh Kumar G.
SIGN IN To post a reply.
- 5 Replies
- 3 Participants
-
TO Tom
- Feb 28, 2019 11:10 AM UTC
- Mar 28, 2019 11:21 AM UTC