//------------------------------------------------------------------------------------- #region << Methods >> /// <summary> /// Создает асинхронную задачу и выполняет ее. /// </summary> /// <param name="taskName">Имя задачи.</param> /// <param name="dst">Объект, обрабатывающий уведомления о завершении задачи.</param> /// <param name="workMethod">Рабочий метод задачи.</param> /// <param name="tag">Дополнительная информацияю</param> /// <returns>Объект асинхронной задачи.</returns> public static AsyncTask Run(string taskName, IAsyncTaskDoneHandler dst, Func<object> workMethod, object tag = null) { AsyncTask task = new AsyncTask(taskName, dst) { WorkMethod = workMethod, Tag = tag }; Run(task); return task; }
//------------------------------------------------------------------------------------- /// <summary> /// Инициализирующий конструктор. /// </summary> public AsyncTask(string taskName, IAsyncTaskDoneHandler dst, Func<object> workMethod, object tag) { this.dst = dst; this.name = taskName; this.workMethod = workMethod; this.tag = tag; }
//------------------------------------------------------------------------------------- /// <summary> /// Прерывает все задачи для указанного объекта уведомления. /// </summary> /// <param name="dest">Объект, обрабатывающий уведомления о завершении задачи.</param> public static void AbortTasks(IAsyncTaskDoneHandler dest) { List<AsyncTask> toDel = new List<AsyncTask>(); lock (tasks) { foreach (AsyncTask at in tasks) if (at.TaskDoneHandler != null && at.TaskDoneHandler.Equals(dest)) toDel.Add(at); foreach (AsyncTask at in toDel) at.thread.Abort(); } }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //------------------------------------------------------------------------------------- #region << Constructors >> /// <summary> /// Инициализирующий конструктор. /// </summary> public AsyncTask(string taskName, IAsyncTaskDoneHandler dst) { this.dst = dst; this.name = taskName; }
//------------------------------------------------------------------------------------- /// <summary> /// Определяет, выполняется ли хотя бы одна задача для указанного объекта. /// </summary> /// <param name="dest">Объект, обрабатывающий уведомления о завершении задачи.</param> /// <returns></returns> public static bool ContainsTask(IAsyncTaskDoneHandler dest) { lock (tasks) foreach (AsyncTask t in tasks) if (t.TaskDoneHandler.Equals(dest)) return true; return false; }