示例#1
0
    void EqualDelegateTest()
    {
        dynamic d = this;

//		Assert (d == delegate { }, true, "#1");

        EmptyDelegate b = EqualDelegateTest;

        d = b;

        //Assert (d == EqualDelegateTest, true, "#2");

/*
 *
 *      void EqualTestDelegate_2 ()
 *      {
 *              EmptyDelegate ed = delegate () {};
 *
 *              Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
 *              AssertNodeType (e2, ExpressionType.Equal);
 *              Assert (false, e2.Compile ().Invoke (delegate () {}, null));
 *              Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
 *              Assert (false, e2.Compile ().Invoke (ed, delegate {}));
 *              Assert (true, e2.Compile ().Invoke (ed, ed));
 */
    }
示例#2
0
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Make sure we draw properly
            EmptyDelegate waitForRender = DoNotingFunc;

            Dispatcher.Invoke(waitForRender, System.Windows.Threading.DispatcherPriority.Background);
        }
        public IEnumerable <PcapFrame> PacketEnumerator(EmptyDelegate waitFunction, StreamReadCompletedCallback captureCompleteCallback)
        {
            const int MIN_TAKE_TIMEOUT = 100;
            int       timeoutMilliSecs = MIN_TAKE_TIMEOUT;

            var cancellationToken = this.backgroundStreamReaderCanceller.Token;
            //int maxSleepMS = (int)Math.Sqrt(2.0 * this.readTimeoutMilliseconds);//200*200/2 = 20.000 = 20 seconds
            //maxSleepMS += timeoutMilliSecs;//to make sure BlockingRead timeouts before
            int maxSleepMS = (int)Math.Sqrt(2.0 * this.readTimeoutMilliseconds + timeoutMilliSecs * timeoutMilliSecs);

            while (!cancellationToken.IsCancellationRequested && (/*this.backgroundStreamReader.IsBusy ||*/ !this.EndOfStream() || this.packetQueue.Count > 0))
            {
                /*
                 * if(this.packetQueue.Count>0) {
                 *  sleepMilliSecs = 20;
                 *  PcapFrame packet;
                 *  lock(this.packetQueue) {
                 *      packet=this.packetQueue.Dequeue();
                 *  }
                 *  this.dequeuedByteCount+=packet.Data.Length;
                 *  if (this.packetQueue.Count < this.packetQueueMaxSize / 2)
                 *      this.packetQueueHasRoomEvent.Set();
                 *  yield return packet;
                 * }
                 * else {
                 *  if (sleepMilliSecs++ > maxSleepMS) {//200*200/2 = 20.000 = 20 seconds
                 *      //abort the reading, something has gone wrong...
                 *      yield break;
                 *  }
                 *  if (waitFunction != null)
                 *      waitFunction();
                 *  else {
                 *      //This works in .NET 4.5 and .NET Standard:
                 *      System.Threading.Tasks.Task.Delay(sleepMilliSecs).Wait();
                 *
                 *      //This works in .NET 4.0
                 *      //System.Threading.Thread.Sleep(sleepMilliSecs);
                 *
                 *  }
                 * }
                 */
                if (this.packetQueue.TryTake(out PcapFrame packet, timeoutMilliSecs, cancellationToken))
                {
                    timeoutMilliSecs        = MIN_TAKE_TIMEOUT;
                    this.dequeuedByteCount += packet.Data.Length;
                    yield return(packet);
                }
                else
                {
                    if (timeoutMilliSecs++ > maxSleepMS)  //20 seconds of total waiting time since last Take/Dequeue
                    //abort the reading, something has gone wrong...
                    {
                        yield break;
                    }
                    waitFunction?.Invoke();
                }
            }

            //yield break;
        }
        public MainFormPhoneLineControl(
            ICore core,
            int line,
            KryptonCheckButton controlButton,
            Control controlCallerName,
            Control controlCallerNumber,
            Control controlDuration,
            Control controlCallState,
            KryptonCheckButton holdButton
            )
        {
            _callOnDurationChanged = Call_OnDurationChanged;
            _callOnInfoChanged     = Call_OnInfoChanged;
            _callOnStateChanged    = Call_OnStateChanged;
            _callOnRemoved         = Call_OnRemoved;

            _core                = core;
            Line                 = line;
            ControlButton        = controlButton;
            _controlCallerName   = controlCallerName;
            _controlCallerNumber = controlCallerNumber;
            _controlDuration     = controlDuration;
            _controlCallState    = controlCallState;
            _holdButton          = holdButton;

            _controlCallerNumber.TextChanged += _controlCallerNumber_TextChanged;

            RefreshBackUI();
        }
        private void Search()
        {
            if (pnlResults.InvokeRequired)
            {
                EmptyDelegate ed = new EmptyDelegate(Search);
                Invoke(ed);
            }
            else
            {
                eligibility_data ed       = new eligibility_data();
                DataTable        matches  = ed.Search(BuildSQL());
                DateTime?        lastDate = new DateTime(1900, 1, 1);
                numAppointmentsFound = matches.Rows.Count;

                pnlResults.SuspendLayout();
                pnlResults.Controls.Clear();

                foreach (DataRow aRow in matches.Rows)
                {
                    ed = new eligibility_data();
                    ed.Load(aRow);
                    AddAppointment(ed, lastDate);
                    lastDate = ed.appt_date;
                }
                pnlResults.ResumeLayout();
                UpdateLastLabelSafe(lastDateLabel, numAppointmentsCurrentDate);
                UpdateBinCounts();
            }
        }
示例#6
0
        public IEnumerable <PcapPacket> PacketEnumerator(EmptyDelegate waitFunction, ReadCompletedCallback captureCompleteCallback)
        {
            while (!this.backgroundFileReader.CancellationPending && (this.backgroundFileReader.IsBusy || fileStream.Position + 1 < fileStream.Length || this.packetQueue.Count > 0))
            {
                //loops++;
                if (this.packetQueue.Count > 0)
                {
                    PcapPacket packet;
                    lock (this.packetQueue)
                    {
                        packet = this.packetQueue.Dequeue();
                    }
                    this.dequeuedByteCount += packet.Data.Length;
                    yield return(packet);
                }
                else
                {
                    if (waitFunction == null)
                    {
                        System.Threading.Thread.Sleep(20);
                    }
                    else
                    {
                        waitFunction();
                    }
                }
            }

            //yield break;
        }
示例#7
0
        public static void Update(ref ulong Alarm, EmptyDelegate Callback, uint DelayInMsec, bool SeparateThread)
        {
            if (Alarm != NULL_ALARM)
            {
                doSyncAction(ActionType.RemoveNoUpdate, Alarm, null);
            }

            Alarm = Delay(Callback, DelayInMsec, SeparateThread);
        }
示例#8
0
 protected void Autoescape(TemplateContext Context, dynamic Expression, EmptyDelegate Block)
 {
     bool OldAutoescape = Context.Autoescape;
     Context.Autoescape = Expression;
     {
         Block();
     }
     Context.Autoescape = OldAutoescape;
 }
示例#9
0
        protected void Autoescape(TemplateContext Context, dynamic Expression, EmptyDelegate Block)
        {
            bool OldAutoescape = Context.Autoescape;

            Context.Autoescape = Expression;
            {
                Block();
            }
            Context.Autoescape = OldAutoescape;
        }
示例#10
0
        public WaitDlg()
        {
            InitializeComponent();

            Show();

            // Make sure we draw properly
            EmptyDelegate waitForRender = DoNotingFunc;

            Dispatcher.Invoke(waitForRender, System.Windows.Threading.DispatcherPriority.Background);
        }
 private void StandardInitialization()
 {
     InitializeComponent();
     updateMainLabel     = new UpdateLabelDelegate(UpdateMainLabel);
     updateProgressBar   = new UpdateProgressBarDelegate(UpdateProgressBar);
     updateBottomBar     = new UpdateLabelDelegate(UpdateBottomBar);
     uploadFiles         = new EmptyDelegate(StartFileUploadThreadSafe);
     CloseOnComplete     = true;
     formTimer.AutoReset = false;
     formTimer.Elapsed  += formTimer_Elapsed;
 }
示例#12
0
文件: Call.cs 项目: modernstar/core
        private void SafeRaiseEvent(EmptyDelegate del)
        {
            if (del == null)
            {
                return;
            }

            var invocationList = del.GetInvocationList();

            foreach (var current in invocationList)
            {
                ((EmptyDelegate)current).BeginInvoke(_emptyDelegateAsyncCallback, current);
            }
        }
 private void ImportTouchup()
 {
     if (lblMaxResults.InvokeRequired)
     {
         EmptyDelegate d = new EmptyDelegate(ImportTouchup);
         Invoke(d);
     }
     else
     {
         pnlTop.Enabled = true;
         btnCheckEligibility.Enabled = true;
         Search();
         pnlLoading.Visible = false;
     }
 }
示例#14
0
        public IEnumerable <PcapFrame> PacketEnumerator(EmptyDelegate waitFunction, StreamReadCompletedCallback captureCompleteCallback)
        {
            int sleepMilliSecs = 20;

            var cancellationToken = this.backgroundStreamReaderCanceller.Token;
            int maxSleepMS        = (int)Math.Sqrt(2.0 * this.readTimeoutMilliseconds); //200*200/2 = 20.000 = 20 seconds

            maxSleepMS += sleepMilliSecs;                                               //to make sure BlockingRead timeouts before
            while (!cancellationToken.IsCancellationRequested && (/*this.backgroundStreamReader.IsBusy ||*/ !this.EndOfStream() || this.packetQueue.Count > 0))
            {
                if (this.packetQueue.Count > 0)
                {
                    sleepMilliSecs = 20;
                    PcapFrame packet;
                    lock (this.packetQueue) {
                        packet = this.packetQueue.Dequeue();
                    }
                    this.dequeuedByteCount += packet.Data.Length;
                    if (this.packetQueue.Count < this.packetQueueMaxSize / 2)
                    {
                        this.packetQueueHasRoomEvent.Set();
                    }
                    yield return(packet);
                }
                else
                {
                    if (sleepMilliSecs++ > maxSleepMS)  //200*200/2 = 20.000 = 20 seconds
                    //abort the reading, something has gone wrong...
                    {
                        yield break;
                    }
                    if (waitFunction != null)
                    {
                        waitFunction();
                    }
                    else
                    {
                        //This works in .NET 4.5 and .NET Standard:
                        System.Threading.Tasks.Task.Delay(sleepMilliSecs).Wait();

                        //This works in .NET 4.0
                        //System.Threading.Thread.Sleep(sleepMilliSecs);
                    }
                }
            }

            //yield break;
        }
示例#15
0
 public void Start(int advanceCount)
 {
     if (advanceCount > 0)
     {
         EmptyDelegate nextDelegate = new EmptyDelegate(Next);
         while (advanceCount-- > 0)
         {
             Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, nextDelegate);
             Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, nextDelegate);
         }
     }
     else if (fActivePanel.PanelState == PanelState.Paused)
     {
         fActivePanel.UnPause();
     }
 }
示例#16
0
        public static void TryActionHelper(EmptyDelegate method, int retryCount)
        {
            bool retry = false;

            do
            {
                try
                {
                    method.Invoke();
                    retry = false;
                }
                catch (Exception ex)
                {
                    retry = (--retryCount) > 0 ? true : false;
                }
            } while (retry);
        }
示例#17
0
        public static ulong Delay(EmptyDelegate Callback, uint DelayInMsec, bool SeparateThread)
        {
            ulong alarm = ticks + (ulong)(DelayInMsec / msecPerTick) + 2;

            // separate threads have even tick counts

            if (SeparateThread)
            {
                alarm &= MASK_LONG;
            }
            else
            {
                alarm |= 0x01;
            }

            return(doSyncAction(ActionType.Add, alarm, Callback));
        }
示例#18
0
        public static void TryActionHelper(EmptyDelegate method, int retryCount)
        {
            bool retry = false;

            do
            {
                try
                {
                    method.Invoke();
                    retry = false;
                }
                catch (Exception ex)
                {
                    retry = (--retryCount) > 0 ? true : false;
                    Console.WriteLine(ex.Message);
                }
            } while (retry);
        }
 private void UpdateBinCounts()
 {
     if (btnTomorrow.InvokeRequired)
     {
         EmptyDelegate ed = new EmptyDelegate(UpdateBinCounts);
         Invoke(ed);
     }
     else
     {
         eligibility_data ed = new eligibility_data();
         UpdateBinCount(ed.Search(BuildSQL(true, FormSearchMode.Unsent)).Rows[0][0].ToString(),
                        btnUnverified, "Unsent", _searchMode == FormSearchMode.Unsent);
         UpdateBinCount(ed.Search(BuildSQL(true, FormSearchMode.Rejected)).Rows[0][0].ToString(),
                        btnRejected, "Rejected", _searchMode == FormSearchMode.Rejected);
         UpdateBinCount(ed.Search(BuildSQL(true, FormSearchMode.Tomorrow)).Rows[0][0].ToString(),
                        btnTomorrow, "Tomorrow", _searchMode == FormSearchMode.Tomorrow);
         UpdateBinCount(ed.Search(BuildSQL(true, FormSearchMode.AllUpcoming)).Rows[0][0].ToString(),
                        btnUpcoming, "All Upcoming", _searchMode == FormSearchMode.AllUpcoming);
         UpdateBinCount(ed.Search(BuildSQL(true, FormSearchMode.Sent)).Rows[0][0].ToString(),
                        btnSent, "Sent", _searchMode == FormSearchMode.Sent);
     }
 }
示例#20
0
        public IEnumerable <PcapFrame> PacketEnumerator(EmptyDelegate waitFunction, StreamReadCompletedCallback captureCompleteCallback)
        {
            int sleepMilliSecs = 20;
            int maxSleepMS     = (int)Math.Sqrt(2.0 * this.readTimeoutMilliseconds); //200*200/2 = 20.000 = 20 seconds

            maxSleepMS += sleepMilliSecs;                                            //to make sure BlockingRead timeouts before
            while (!this.backgroundStreamReader.CancellationPending && (this.backgroundStreamReader.IsBusy || !this.EndOfStream() || this.packetQueue.Count > 0))
            {
                if (this.packetQueue.Count > 0)
                {
                    sleepMilliSecs = 20;
                    PcapFrame packet;
                    lock (this.packetQueue) {
                        packet = this.packetQueue.Dequeue();
                    }
                    this.dequeuedByteCount += packet.Data.Length;
                    yield return(packet);
                }
                else
                {
                    if (sleepMilliSecs++ > maxSleepMS)  //200*200/2 = 20.000 = 20 seconds
                    //abort the reading, something has gone wrong...
                    {
                        yield break;
                    }
                    if (waitFunction != null)
                    {
                        waitFunction();
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(sleepMilliSecs);
                    }
                }
            }

            //yield break;
        }
        private void TickTimer()
        {
            if (InvokeRequired)
            {
                EmptyDelegate ed = new EmptyDelegate(TickTimer);
                Invoke(ed);
            }
            else
            {
                string callMinutesDisplay;

                if (callTime.Minutes > 10)
                {
                    callMinutesDisplay = callTime.Minutes.ToString();
                }
                else
                {
                    callMinutesDisplay = "0" + callTime.Minutes;
                }

                string callSecondsDisplay;
                int    callSeconds;

                callSeconds = callTime.Seconds % 60;

                if (callSeconds > 10)
                {
                    callSecondsDisplay = callSeconds.ToString();
                }
                else
                {
                    callSecondsDisplay = "0" + callSeconds;
                }

                Text = "Multiple Claim Call: " + callMinutesDisplay + ":" + callSecondsDisplay;
            }
        }
示例#22
0
 private void UpdateForm()
 {
     if (InvokeRequired)
     {
         EmptyDelegate d = new EmptyDelegate(UpdateForm);
         Invoke(d, null);
     }
     else
     {
         if (_error != string.Empty)
             MessageBox.Show(_error, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         else
         {
             textBoxGetAdrH.Text = GetHex(_getData[0]);
             textBoxGetLenH.Text = GetHex(_getData[1]);
             if (_setCmd == 0)
                 textBoxGetDatH.Text = System.Text.Encoding.ASCII.GetString(_getData, 2, _getData.Length - 4);
             else
             {
                 textBoxGetDatH.Text = "";
                 for (int i = 2; i < _getData.Length - 2; i++)
                     textBoxGetDatH.Text += GetHex(_getData[i]) + " ";
             }
             textBoxGetCRCH.Text = GetHex(_getData[_getData.Length - 1]) + " " + GetHex(_getData[_getData.Length - 2]);
         }
         Text = string.Format("Test FTDI ({0})", _counter);
         Update();
     }
 }
示例#23
0
        private static ulong doSyncAction(ActionType Type, ulong Tick, EmptyDelegate Callback)
        {
            bool separateThread = false;

            lock (llock)
            {
                switch (Type)
                {
                case ActionType.Add:

                    while (pendingCallbacks.ContainsKey(Tick))
                    {
                        Tick += 2;
                    }

                    pendingCallbacks.Add(Tick, Callback);
                    updateNextCallback();
                    return(Tick);

                case ActionType.Remove:
                    if (pendingCallbacks.ContainsKey(Tick))
                    {
                        pendingCallbacks.Remove(Tick);
                        updateNextCallback();
                    }
                    return(0);

                case ActionType.RemoveNoUpdate:
                    if (pendingCallbacks.ContainsKey(Tick))
                    {
                        pendingCallbacks.Remove(Tick);
                    }
                    break;

                case ActionType.Invoke:
                    if (pendingCallbacks.ContainsKey(nextCallback))
                    {
                        ulong key = nextCallback;

                        Callback = pendingCallbacks[key];
                        RemoveAlarm(key);
                        separateThread = ((key & 0x01) == 0);
                    }
                    else
                    {
                        updateNextCallback();
                        return(0);
                    }
                    break;

                default:
                    return(0);
                }
            }
            if (Type == ActionType.Invoke)
            {
                if (separateThread)
                {
                    Thread t = new Thread(new ThreadStart(Callback));
                    t.IsBackground = true;
                    t.Priority     = ThreadPriority.BelowNormal;
                    t.Start();
                }
                else
                {
                    Callback();
                }
            }
            return(0);
        }
示例#24
0
 static void Closure(EmptyDelegate x)
 {
 }
示例#25
0
 public void Add(EmptyDelegate a)
 {
     lock (_callbacks) {
         _callbacks.Add(a);
     }
 }
示例#26
0
 public void UnregisterHealedListener(EmptyDelegate del)
 {
     OnHealed -= del;
 }
示例#27
0
 public override void CreateView(EquipmentSlot dataSource)
 {
     base.CreateView(dataSource);
     trigger      += dataSource.OnTrigger;
     itemSlot.text = dataSource.slot.ToString();
 }
示例#28
0
 public void UnregisterUpdateListener(EmptyDelegate del)
 {
     OnUpdate -= del;
 }
示例#29
0
        public void AddTable()
        {
            EmptyDelegate updTables = UpdateTablesList;

            _windowManager.ShowWindow(new AddTableViewModel(_windowManager, updTables));
        }
示例#30
0
        protected void Foreach(TemplateContext Context, String VarName, dynamic Expression, EmptyDelegate Iteration, EmptyDelegate Else = null)
        {
            int Index = 0;

            foreach (var Item in DynamicUtils.ConvertToIEnumerable(Expression))
            {
                Context.SetVar("loop", new Dictionary <String, dynamic> {
                    { "index", Index + 1 },
                    { "index0", Index },
                });
                Context.SetVar(VarName, Item);
                Iteration();
                Index++;
            }

            if (Index == 0)
            {
                if (Else != null)
                {
                    Else();
                }
            }
        }
示例#31
0
文件: KBase.cs 项目: tmbx/etkwm
 /// <summary>
 /// Execute the specified delegate in the context of the UI
 /// asynchronously.
 /// </summary>
 public static void ExecInUI(EmptyDelegate d)
 {
     ExecInUI(d, null);
 }
示例#32
0
		public AsynchronousActivity()
		{
			asyncDelegate = new EmptyDelegate(OnAsyncWork);
		}
示例#33
0
        static void Main(string[] args)
        {
            Converter          converter = new Converter();
            Int2StringDelegate del       = new Int2StringDelegate(converter.ConvertToString);

            //variabile di tipo implicito
            var del2 = new Int2StringDelegate(converter.ConvertToString);

            //creazione implicita delegate
            Int2StringDelegate isdel = converter.ConvertToString;

            Int2StringDelegate del3 = (Int2StringDelegate)Delegate.CreateDelegate(typeof(Int2StringDelegate), converter, "ConvertToString");

            del3(123);

            string str = isdel(123);

            str = isdel.Invoke(123);

            //ottenere informazioni
            Console.WriteLine("ottenere informazioni sul delegate");
            var method = isdel.Method;

            Console.WriteLine(method.Name);
            var target = isdel.Target;

            Console.WriteLine(target.ToString());

            Console.WriteLine("ottenere informazioni sul delegate con metodo statico");
            isdel = Converter.StaticConvertToString;
            Console.WriteLine(isdel.Method);
            Console.WriteLine(isdel.Target);

            UseDelegate(Converter.StaticConvertToString, 1, 2, 3);

            EmptyDelegate multicast = Metodo1;

            multicast += Metodo2;
            multicast += Metodo2; //un metodo può essere aggiunto più volte
            multicast();
            multicast -= Metodo2;
            Delegate[] list = multicast.GetInvocationList();
            foreach (Delegate delInstance in list)
            {
                Console.WriteLine("invoco {0}", delInstance.Method);
                (delInstance as EmptyDelegate).Invoke();
                //delInstance.DynamicInvoke();
            }

            multicast = (EmptyDelegate)Delegate.Combine(new EmptyDelegate(Metodo1), new EmptyDelegate(Metodo2));

            multicast -= Metodo1;
            multicast -= Metodo2;
            if (multicast != null)
            {
                multicast.Invoke();
            }

            Int2StringDelegate multi = converter.ConvertToString;

            multi += converter.RaddoppiaNumero;
            Console.WriteLine(multi(10));

            int         x        = 1;
            RefDelegate multiref = Raddoppia;

            multiref += Triplica;
            multiref(ref x);
            Console.WriteLine(x);

            ConvertOriginToDest <int, string> siconvert = converter.StringToInt;
            int i = siconvert("123");

            ConvertOriginToDest <string, int> isconvert = converter.Int2String;
            string s = isconvert(123);

            Func <int, int> func = Fattoriale;

            int n = EvaluateFunction <int>(func, 10);
            Func <double, double> funcRadice = Math.Sqrt;
            double radice = EvaluateFunction <double>(funcRadice, 144);
            double log    = EvaluateFunction(Math.Log10, 100.0);

            //stampo l'errore
            OperazionePericolosa(PrintError);


            //covarianza func
            Func <string> funcHello = Hello;
            Func <object> funcObj   = funcHello;
            object        obj       = funcObj();

            //controvarianza Action
            Action <object> actObj = UseObject;
            Action <string> actStr = actObj;

            actStr("Hello");
        }
示例#34
0
 private void UpdateStatus()
 {
     if (InvokeRequired)
     {
         EmptyDelegate d = new EmptyDelegate(UpdateStatus);
         Invoke(d, null);
     }
     else
     {
         btnStart.Enabled = _isStop;
         btnStop.Enabled = !_isStop;
         groupBox1.Enabled = _isStop;
         if (_isExit)
             Close();
     }
 }
示例#35
0
文件: Activity.cs 项目: alexfordc/Au
 public AsynchronousActivity()
 {
     asyncDelegate = new EmptyDelegate(OnAsyncWork);
 }
示例#36
0
		async protected Task ForeachAsync(TemplateContext Context, String VarName, dynamic Expression, EmptyDelegate Iteration, EmptyDelegate Else = null)
		{
			int Index = 0;
			foreach (var Item in DynamicUtils.ConvertToIEnumerable(Expression))
			{
				Context.SetVar("loop", new Dictionary<String, dynamic> {
					{ "index", Index + 1 },
					{ "index0", Index },
				});
				Context.SetVar(VarName, Item);
				await Iteration();
				Index++;
			}

			if (Index == 0)
			{
				if (Else != null) await Else();
			}
		}
 protected void StartAsycWaitFunction(EmptyDelegate function)
 {
     asyncWaitThread = new Thread(new ThreadStart(function));
     asyncWaitThread.Start();
 }
示例#38
0
 public void UnregisterDeleteListener(EmptyDelegate del)
 {
     OnDelete -= del;
 }