SQL asynchrone C # dans singleton et delegates

J’essaie de construire une classe qui sera responsable de toutes les opérations sur la firebase database.

En utilisant le motif singleton à partir d’ici: http://codebender.denniland.com/a-singleton-base-class-to-implement-the-singleton-pattern-in-c/

J’ai construit une classe comme celle-ci:

class DB : SingletonBase { public static readonly ssortingng SqlConnectionSsortingng = @"Data Source=MYDB;Initial Catalog=PRODUCTS;Integrated Security=True;Asynchronous Processing=true;"; private DB() { } public void loadData() { SqlConnection conn = new SqlConnection(SqlConnectionSsortingng); 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"); } } 

Dans ma classe principale, j’utilise ceci comme ceci:

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

Mais cela ne me donnera que ma boîte de message.

Ce que je voudrais faire est de déclarer une fonction dans ma classe principale qui sera appelée après que la requête SQL retourne quelque chose.

Je pense que la meilleure façon serait d’utiliser des événements, mais je ne sais pas comment le faire correctement.

J’aimerais faire quelque chose comme ça dans ma classe principale:

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

Pour que je puisse spécifier la fonction qui sera appelée une fois l’appel SQL terminé.

Je ne sais pas si c’est la meilleure façon de procéder, alors tout commentaire, suggestion ou solution est la bienvenue.

Ce que j’aimerais réaliser, c’est d’avoir une classe responsable d’appeler SQL de manière asynchrone et de transmettre des données à d’autres fonctions qui le traiteront.

 public delegate void NotifyCallback(ssortingng message); public class ClassWithCommandAndCallback { public SqlCommand Sql; public NotifyCallback Callback; } public void loadData(NotifyCallback callback) { ClassWithCommandAndCallback ar = new ClassWithCommandAndCallback(); ar.Sql = cmd; ar.Callback = callback; IAsyncResult result = cmd.BeginExecuteReader(new AsyncCallback(HandleCallback), ar, CommandBehavior.CloseConnection); } private void HandleCallback(IAsyncResult result) { ClassWithCommandAndCallback ar = (ClassWithCommandAndCallback)result.AsyncState; ar.Callback("loaded (SQL was: "+ar.Sql+")"); }