Bonjour,
Pour un projet en développement, j'ai mis au point un delegate asynchrone avec 2 événements de type EventWaitHandle dont l'un informe quand le traitement est terminé et l'autre autorise le traitement suivant.
C'est une classe que j'ai appelé DelegateNotify qui encaspule le delegate et les 2 événements.
Pour illustrer ce delegate, j'ai développé un petit test sympathique et ludique : une télé!
Car une télé a besoin que l'image soit entièrement affichée avant de passer à la suivante.
Mais, ce n'est qu'un petit test alors il n'y a pas de présentateur !
Salut :)
Source / Exemple :
1/ Le delegate:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.Reflection;
using System.Threading;
namespace notify
{
public class DelegateNotify
{
public delegate void Notify();
public delegate void AsyncCallback(IAsyncResult ar);
private EventWaitHandle EventFinished;
private EventWaitHandle Event;
private Notify running;
private AsyncCallback review;
public DelegateNotify()
{
this.Event = new EventWaitHandle(false, EventResetMode.AutoReset);
this.EventFinished = new EventWaitHandle(false, EventResetMode.AutoReset);
}
public void SetFunction(Notify not)
{
this.running = not;
}
public void SetReview(AsyncCallback callback)
{
this.review = callback;
}
public void WaitBeforeContinue()
{
WaitHandle.WaitAny(new WaitHandle[] { this.Event });
}
public void WaitWorkEnding()
{
WaitHandle.WaitAny(new WaitHandle[] { this.EventFinished });
}
public void NotifyContinue()
{
this.Event.Set();
}
public void NotifyWorkEnding()
{
this.EventFinished.Set();
}
public void Invoke()
{
this.running.BeginInvoke(new System.AsyncCallback(delegate(IAsyncResult async) {
if (this.review != null)
this.review(async);
}), null);
}
}
}
Conclusion :
Pour résumer, la classe DelegateNotify utilise 1 delegate principal appelé Notify ainsi que 2 EventWaitHandle nommés EventFinished et Event. Il faut appeler d'abord SetFunction avec l'implémentation du delegate puis Invoke.
Ensuite, dans le delegate, on peut appeler NotifyWorkEnding et WaitBeforeContinue.
Dans l'application, on peut appeler WaitWorkEnding et NotifyContinue.
Et voila
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.