/// <summary> /// Is automatically polled while the daemon is alive /// </summary> /// <param name="daemon"></param> void DoMaintenance(Daemon daemon) { lock (general_task_items) { for (int i = general_task_items.Count - 1; i >= 0; --i) { GeneralTaskItem general_task_item = general_task_items[i]; object target = general_task_item.target.Target; if (null != target) { try { general_task_item.method.Invoke(target, new object[] { daemon }); } catch (Exception ex) { Logging.Error(ex, "An exception occurred in the GeneralTaskDaemon with GeneralTaskItem {0}", general_task_item.description); } } else { Logging.Info("A GeneralTaskItem has been garbage collected, so throwing it away: {0}", general_task_item.description); general_task_items.RemoveAt(i); } } } daemon.Sleep(10 * 1000); }
public void AddGeneralTask(GeneralTaskDelegate general_task_delegate) { lock (general_task_items) { GeneralTaskItem general_task_item = new GeneralTaskItem(); general_task_item.description = String.Format("{0}:{1}", general_task_delegate.Target, general_task_delegate.Method.Name); general_task_item.method = general_task_delegate.Method; general_task_item.target = new WeakReference(general_task_delegate.Target); general_task_items.Add(general_task_item); } }
public void RemoveGeneralTask(GeneralTaskDelegate general_task_delegate) { lock (general_task_items) { GeneralTaskItem general_task_item = new GeneralTaskItem(); general_task_item.description = String.Format("{0}:{1}", general_task_delegate.Target, general_task_delegate.Method.Name); general_task_item.method = general_task_delegate.Method; general_task_item.target = new WeakReference(general_task_delegate.Target); general_task_items.Add(general_task_item); for (int i = 0; i < general_task_items.Count; ++i) { if (general_task_items[i].target == general_task_delegate.Target) { general_task_items.RemoveAt(i); break; } } } }