private void Analyze(ref StatisticFigure s)
        {
            NpgsqlConnection lclConn = null;

            try
            {
                string        strSql;
                NpgsqlCommand cmd;
                lclConn = analyzer.DbMgr.Conn.CloneWith(analyzer.DbMgr.Conn.ConnectionString);
                lclConn.Open();
                switch (s.type)
                {
                case StatisticFigureType.Mean:
                    strSql  = String.Format(@"SELECT AVG({0}) FROM {1}", s.parameters[0], analyzer.DbMgr.Currtable);
                    cmd     = new NpgsqlCommand(strSql, lclConn);
                    s.value = (double)cmd.ExecuteScalar();
                    break;

                case StatisticFigureType.Variance:
                    strSql  = String.Format(@"SELECT VAR_POP({0}) FROM {1}", s.parameters[0], analyzer.DbMgr.Currtable);
                    cmd     = new NpgsqlCommand(strSql, lclConn);
                    s.value = (double)cmd.ExecuteScalar();
                    break;

                case StatisticFigureType.StandardDeviation:
                    strSql  = String.Format(@"SELECT STDDEV_POP({0}) FROM {1}", s.parameters[0], analyzer.DbMgr.Currtable);
                    cmd     = new NpgsqlCommand(strSql, lclConn);
                    s.value = (double)cmd.ExecuteScalar();
                    break;

                case StatisticFigureType.Covariance:
                    strSql  = String.Format(@"SELECT COVAR_POP({0}, {1}) FROM {2}", s.parameters[1], s.parameters[0], analyzer.DbMgr.Currtable);
                    cmd     = new NpgsqlCommand(strSql, lclConn);
                    s.value = (double)cmd.ExecuteScalar();
                    break;

                case StatisticFigureType.CorrelationCoefficient:
                    strSql  = String.Format(@"SELECT CORR({0}, {1}) FROM {2}", s.parameters[1], s.parameters[0], analyzer.DbMgr.Currtable);
                    cmd     = new NpgsqlCommand(strSql, lclConn);
                    s.value = (double)cmd.ExecuteScalar();
                    break;
                }
                Interlocked.Increment(ref finishedTask);
            }
            catch (Exception exe)
            {
                MessageBox.Show(exe.Message);
            }
            finally
            {
                if (lclConn != null)
                {
                    lclConn.Close();
                }
            }
        }
        private void btAdd_Click(object sender, EventArgs e)
        {
            StatisticFigure s = new StatisticFigure();

            s.type = (StatisticFigureType)cbStatType.SelectedItem;
            if (cbSrc2.Visible)
            {
                s.parameters = new string[] { (string)cbSrc1.SelectedItem, (string)cbSrc2.SelectedItem };
            }
            else
            {
                s.parameters = new string[] { (string)cbSrc1.SelectedItem };
            }
            tbStatNeedsAnalyze.Items.Add(s);
        }
 private void btStart_Click(object sender, EventArgs e)
 {
     allTask = tbStatNeedsAnalyze.Items.Count;
     if (allTask < 1)
     {
         return;
     }
     isReportReady = false;
     tbReport.Clear();
     finishedStats.Clear();
     finishedTask     = 0;
     btSave.Enabled   = false;
     btStart.Enabled  = false;
     btStart.Text     = "Analyzing...";
     btAdd.Enabled    = false;
     btRemove.Enabled = false;
     progressTimer.Start();
     sw = Stopwatch.StartNew();
     Task AnalyzeTk = Task.Run(() =>
     {
         isTaskRunning = true;
         try
         {
             Parallel.For(0, allTask, index =>
             {
                 StatisticFigure s = (StatisticFigure)tbStatNeedsAnalyze.Items[index];
                 Analyze(ref s);
                 finishedStats.Add(s);
             });
             isReportReady = true;
             isTaskRunning = false;
         }
         catch (Exception exc)
         {
             MessageBox.Show(exc.Message);
             isReportReady = false;
         }
         finally
         {
             isTaskRunning = false;
         }
     });
 }