Using BackgroundWorker to return multiple chart series

3 posts, 0 answers
  1. M
    M avatar
    1 posts
    Member since:
    Jan 2012

    Posted 26 Nov 2012 Link to this post

    EDIT: I solved the issue, I just had to create a new background worker for each series.

    Hey peeps,

    I'm just getting started with Telerik's controls and have successfully managed to plot a multi series chart. Now due to the time it takes to populate the chartdata, I wanted to do this with a background worker. I successfully managed to have a backgroundworker plot a single chartseries, but I don't know how to have it plot multiple. Lets look at the code:

    public BackgroundWorker worker = new BackgroundWorker();
     public Window1()
     // Set up the BackgroundWorker object by 
     // attaching event handlers. 
     private void InitializeBackgroundWorker()
         worker.DoWork +=new DoWorkEventHandler(worker_DoWork);
         worker.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
     //Define a New Chart Data Class for each graph
     public class ChartDataClass1
         public double X1 { get; set; }
         public double Y1 { get; set; }
         public ChartDataClass1()
     public class ChartDataClass2
         public double X2 { get; set; }
         public double Y2 { get; set; }
         public ChartDataClass2()
     private void btn1_Click(object sender, RoutedEventArgs e)
     void worker_DoWork(object sender, DoWorkEventArgs e)
         // On the worker thread...cannot make UI calls from here.
         e.Result = MTLB(worker,e);
    private void worker_RunWorkerCompleted(
         object sender, RunWorkerCompletedEventArgs e)
         // First, handle the case where an exception was thrown.
         if (e.Error != null)
             // Finally, handle the case where the operation 
             // succeeded.
             xline.Series[0].ItemsSource = (System.Collections.IEnumerable)e.Result;
     public System.Collections.Generic.List<ChartDataClass1> MTLB(BackgroundWorker worker, DoWorkEventArgs e)
         int st = 1;
         int sp = 20;
         //MATLAB inputs
         MWNumericArray start = 1;
         MWNumericArray stop = 20;
         //MATLAB fn
         Reactor.Class1 rxtr_lib = new Reactor.Class1();
         MWArray[] result = rxtr_lib.rxtr(1, start, stop);
         System.Array NH3 = new double[2 * (sp - st + 1)];
         NH3 = ((MWNumericArray)result[0]).ToVector(MWArrayComponent.Real);
         List<ChartDataClass1> chartData1 = new List<ChartDataClass1>();
         List<ChartDataClass2> chartData2 = new List<ChartDataClass2>();
         for (int i = 0; i < (sp - st); i++)
             ChartDataClass1 cdc = new ChartDataClass1();
             ChartDataClass2 cdc2 = new ChartDataClass2();
             cdc.X1 = i;
             cdc.Y1 = Convert.ToDouble(NH3.GetValue(2 * i));
             cdc2.X2 = i;
             cdc2.Y2 = Convert.ToDouble(NH3.GetValue(2 * i + 1));
         return chartData1;

    The code above populates chartData1 and chartData2, but only allows me to return a single type(chartdataclass1 OR chartdataclass2). My question is, what must I do so that I can return chartData1 AND chartData2 to e.Result? Also, assuming I can return both, how do I then set up e.Result such that I can define Series[0] and Series[1] using e.Result?

  2. Maryam
    Maryam avatar
    1 posts
    Member since:
    Jan 2015

    Posted 02 Jan 2015 Link to this post

    i have written a wcf service:

            public List<string> GetECGValue()
                var query2 = (from r in obj.ECGs where (r.Reading_ID >= 1 && r.Reading_ID <= 10) select r.Value).ToList();
                return query2;

            DataClasses1DataContext obj = new DataClasses1DataContext();
    and this is the chart where i need to bind this service:

    <chart:LineSeries x:Name="C" Stroke="Orange" StrokeThickness="2" ItemsSource="{Binding}">

                                <chartEngine:CategoricalDataPoint Value="20"/>
                                <chartEngine:CategoricalDataPoint Value="40"/>
                                <chartEngine:CategoricalDataPoint Value="35"/>
                                <chartEngine:CategoricalDataPoint Value="40"/>
                                <chartEngine:CategoricalDataPoint Value="30"/>
                                <chartEngine:CategoricalDataPoint Value="50"/>
    ServiceReference1.Service1Client ser = new ServiceReference1.Service1Client();
            public GraphECG()
                ser.GetECGValueCompleted += new EventHandler<GetECGValueCompletedEventArgs>(ser_GetECGValueCompleted);
            void ser_GetECGValueCompleted(object sender, GetECGValueCompletedEventArgs e)
                this.chart.Series[0].ItemsSource = e.Result;
    when i run the project, it show "no data to plot"..

  3. Martin Ivanov
    Martin Ivanov avatar
    1444 posts

    Posted 05 Jan 2015 Link to this post

    Hello Maryam,

    In order to show the chart's data points when the series is data bound you should set the series' binding properties. The ValueBinding and CategoryBinding properties for the categorical series and the XValueBinding and YValueBinding for the continuous series. They are used to bind the properties from your view model to the DataPoint's properties.

    <chart:LineSeries ItemsSource="{Binding}" ValueBinding="MyYValue" CategoryBinding="MyXValue">

    You can take a look at the Create Data-Bound Chart help article which demonstrates this.

    I hope this helps.


    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

Back to Top