1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
using System;
using System.Collections;
using IGestionOperations;
using IGestionClient;
namespace MBServeur
{
/// <summary>
/// Description résumée de MBFacade.
/// </summary>
///
public class MBFacade : MarshalByRefObject, IMBFacade
{
public event UpdateDataHandler _UpdateDataHandler;
public MBFacade()
{
}
public override object InitializeLifetimeService()
{
return null;
}
/// <summary>
/// Retourne un nouvel objet de type MBOperation
/// </summary>
/// <returns></returns>
public IMBService GetNewService(IMBClient client)
{
return new MBService(client,this);
}
/// <summary>
/// Classe utilisée pour envoyer les évènements en utilisant des thread distincts
/// </summary>
class MyThread
{
public delegate void ErrorHandler(Delegate d);
public event ErrorHandler Error;
object[] _args;
Delegate _target;
public MyThread(Delegate d, params object[] args)
{
this._target = d;
this._args = args;
}
public void Call()
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(CallDelegate));
}
void CallDelegate(Object stateInfo)
{
try
{
this._target.DynamicInvoke(this._args);
}
catch
{
if( Error!=null)
{
Error(this._target);
}
}
}
}
public void Unregister(Delegate d)
{
_UpdateDataHandler -= (UpdateDataHandler)d;
System.Console.WriteLine("Unregistered");
}
public void FireUpdateDataEvent()
{
if (_UpdateDataHandler != null)
{
UpdateDataHandler copie = _UpdateDataHandler;
foreach(Delegate d in copie.GetInvocationList())
{
MyThread t=new MyThread(d);
t.Error+=new MBServeur.MBFacade.MyThread.ErrorHandler(Unregister);
t.Call();
}
}
}
}
} |
Partager