Приложение 2. Пример асинхронной обработки данных

using System;
using System.Data;
using System.Data.LinterClient;
using System.Threading;

namespace Test
{
  class Program
  {
    /* Асинхронная работа */
    static void Main(string[] args)
    {
      /* Создание тестовой таблицы */
      CreateDataTable();
      /* Создание разных нитей для поиска минимального
       * и максимального значений в таблице */
      Thread findMinThread = new Thread(FindMin);
      Thread findMaxThread = new Thread(FindMax);
      /* Старт нитей */
      findMinThread.Start();
      findMaxThread.Start();
    }

    static private void FindMin()
    {
      Console.WriteLine("Поиск минимального значения...");
      LinterDbConnection conn = new LinterDbConnection();
      conn.ConnectionString = GetConnectionString();
      conn.Open();
      LinterDbCommand comm = conn.CreateCommand();
      comm.Connection = conn;
      comm.CommandText = "SELECT MIN(X) FROM T";
      object result = comm.ExecuteScalar();
      conn.Close();
      /* Имитируем длительную работу */
      Thread.Sleep(5000);
      Console.WriteLine("Минимальное значение: " + result);
    }

    static private void FindMax()
    {
      Console.WriteLine("Поиск максимального значения...");
      LinterDbConnection conn = new LinterDbConnection();
      conn.ConnectionString = GetConnectionString();
      conn.Open();
      LinterDbCommand comm = conn.CreateCommand();
      comm.Connection = conn;
      comm.CommandText = "SELECT MAX(X) FROM T";
      object result = comm.ExecuteScalar();
      conn.Close();
      /* Имитируем длительную работу */
      Thread.Sleep(7000);
      Console.WriteLine("Максимальное значение: " + result);
    }

    static private void CreateDataTable()
    {
      Console.Write("Создание тестовой таблицы...");
      LinterDbConnection conn = new LinterDbConnection();
      conn.ConnectionString = GetConnectionString();
      conn.Open();
      LinterDbCommand comm = conn.CreateCommand();
      comm.Connection = conn;
      comm.CommandText = "CREATE OR REPLACE TABLE T(X REAL)";
      comm.ExecuteNonQuery();
      comm.CommandText = "INSERT INTO T (X) VALUES (RAND())";
      for (int i = 0; i < = 10000; i++)
      {
        comm.ExecuteNonQuery();
      }
      conn.Close();
      Console.WriteLine("завершено.");
    }

    static private string GetConnectionString()
    {
      /* Чтобы не хранить строку подключения в коде, вы можете
       * получить ее из файла конфигурации */
      return "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    }
  }
}