Asynchroniczny SQL C # wewnątrz singletonu i delegatów

Próbuję zbudować klasę, która będzie odpowiedzialna za wszystkie operacje w bazie danych.

Używając wzorca singleton stąd:http://codebender.denniland.com/a-singleton-base-class-to-implement-the-singleton-pattern-in-c/

Zbudowałem taką klasę:

class DB : SingletonBase<DB>
    {

        public static readonly string SqlConnectionString  = @"Data Source=MYDB;Initial Catalog=PRODUCTS;Integrated Security=True;Asynchronous Processing=true;";

        private DB()
        {
        }

        public void loadData()
        {
            SqlConnection conn = new SqlConnection(SqlConnectionString);
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "STATISTICS_1";

            cmd.Connection = conn;
            conn.Open();
            IAsyncResult result = cmd.BeginExecuteReader(new AsyncCallback(HandleCallback), cmd, CommandBehavior.CloseConnection);
        }

        private void HandleCallback(IAsyncResult result)
        {
            SqlDataReader dr;
            SqlCommand _this = (SqlCommand)result.AsyncState;

            if (result.IsCompleted)
            {
                dr = _this.EndExecuteReader(result);
            }
            else
                dr = null;

            DataTable dt = new DataTable();
            dt.Load(dr);
            dr.Close();
            MessageBox.Show("loaded");
        }
    }

W mojej głównej klasie używam tego w ten sposób:

    private void loadStatistics(object sender, EventArgs e)
    {
        showStatus("loading data");
        DB.Instance.loadData();
    }

Ale to da mi tylko moje okno wiadomości.

Chciałbym zadeklarować funkcję w mojej klasie głównej, która zostanie wywołana po zwróceniu zapytania SQL.

Myślę, że najlepszym sposobem byłoby użycie wydarzeń, ale nie wiem, jak to zrobić.

Chciałbym zrobić coś takiego w mojej głównej klasie:

    private void loadCompleted(string msg)
    {
        MessageBox.Show(msg);
    }

    private void loadStatistics(object sender, EventArgs e)
    {
        showStatus("loading data");
        DB.Instance.loadData(loadCompleted);
    }

Aby móc określić funkcję, która zostanie wywołana po zakończeniu wywołania SQL.

Nie wiem, czy jest to najlepszy sposób na to, więc wszelkie komentarze, sugestie i rozwiązania są mile widziane.

Chciałbym osiągnąć jedną klasę odpowiedzialną za asynchroniczne wywoływanie SQL i przekazywanie danych do innych funkcji, które będą go przetwarzać.

questionAnswers(1)

yourAnswerToTheQuestion