private void btnProcessData_Click(object sender, EventArgs e) { IDistance eucledeanDistance = new EuclideanDistance(); BackgroundWorker backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerReportsProgress = true; backgroundWorker.DoWork += (o, eventArgs) => { for (int k = (int)start.Value; k <= (int)end.Value; k++) { List <double[]> distanceResult = new List <double[]>(); _kMeans = new KMeans(k, eucledeanDistance); Centroid[] centroids = _kMeans.Run(_trainingSet.ToArray()); double result = 0; foreach (double[] point in _trainingSet) { double minValue = Double.MaxValue; foreach (Centroid centroid in centroids) { double distance = eucledeanDistance.Run(point, centroid.Array); if (distance < minValue) { minValue = distance; } } result += minValue; } result /= _trainingSet.Count; _kmeansPointList.Add(new DPoint(k, result)); double progressPercent = (100 * k) / (int)end.Value; ((BackgroundWorker)o).ReportProgress((int)progressPercent, new UserState { Distortion = result, Index = k }); } }; backgroundWorker.ProgressChanged += (o, eventArgsProgressChanged) => { chart1.DataBind(); progressBar1.Value = eventArgsProgressChanged.ProgressPercentage; UserState temp = eventArgsProgressChanged.UserState as UserState; listBox1.Items.Add(String.Format("K={0}, Dist: {1}", temp.Index, Math.Round(temp.Distortion, 2))); }; backgroundWorker.RunWorkerAsync(); }