Modèle de conception de programmation asynchrone

Je travaille sur un petit cadre technique pour CF.NET et ma question est la suivante: comment coder la partie asynchrone? Lisez beaucoup de choses sur MSDN, mais ce n’est pas clair pour moi.

Alors, voici le code:

public class A { public IAsyncResult BeginExecute(AsyncCallback callback) { // What should I put here ? } public void EndExecute() { // What should I put here ? } public void Execute() { Thread.Sleep(1000 * 10); } } 

Si quelqu’un peut m’aider …

Merci !

Vous pouvez utiliser un délégué:

 public class A { public void Execute() { Thread.Sleep(1000 * 3); } } class Program { static void Main() { var a = new A(); Action del = (() => a.Execute()); var result = del.BeginInvoke(state => { ((Action)state.AsyncState).EndInvoke(state); Console.WriteLine("finished"); }, del); Console.ReadLine(); } } 

METTRE À JOUR:

Comme demandé dans la section commentaires, voici un exemple d’implémentation:

 public class A { private Action _delegate; private AutoResetEvent _asyncActiveEvent; public IAsyncResult BeginExecute(AsyncCallback callback, object state) { _delegate = () => Execute(); if (_asyncActiveEvent == null) { bool flag = false; try { Monitor.Enter(this, ref flag); if (_asyncActiveEvent == null) { _asyncActiveEvent = new AutoResetEvent(true); } } finally { if (flag) { Monitor.Exit(this); } } } _asyncActiveEvent.WaitOne(); return _delegate.BeginInvoke(callback, state); } public void EndExecute(IAsyncResult result) { try { _delegate.EndInvoke(result); } finally { _delegate = null; _asyncActiveEvent.Set(); } } private void Execute() { Thread.Sleep(1000 * 3); } } class Program { static void Main() { A a = new A(); a.BeginExecute(state => { Console.WriteLine("finished"); ((A)state.AsyncState).EndExecute(state); }, a); Console.ReadLine(); } } 

Vous n’avez rien de spécial à faire, car l’appelant doit vous appeler par la méthode asynchrone,

Il définit un nouveau délégué pointant sur votre méthode et utilise le .net pour appeler votre méthode de manière asynchrone.

Sous BeginExecute, vous devez démarrer l’opération asynchrone (éventuellement exécuter dans un thread séparé) et renvoyer le plus rapidement possible. Execute doit appeler AsyncCallback à la fin de toutes les opérations pour que les utilisateurs de l’opération asynchrone soient informés et obtiennent le résultat. EndExecute doit arrêter une opération async déjà lancée (en interrompant éventuellement le thread lancé par BeginExecute).
Sans plus de détails, c’est le mieux que je puisse faire.

Si vous souhaitez exécuter une partie du code de manière asynchrone, vous devez utiliser BackgroundWorker. Sauf si, bien entendu, le code que vous appelez ne prend pas en charge le fonctionnement asynchrone de manière native. Tout comme les méthodes de lecture / écriture ou les appels de service.

Si vous souhaitez notifier que l’opération asynchrone est terminée, utilisez le rappel délégué ou événement.