starwing network

C#:Task Manager

ジェネリクスで指定したクラスをマネージメントするためのクラス。
IEnumerable+yield returnによるコルーチンとかする時によろしいかも。

またやる気がある時にyield returnによるコルーチン何某は書くかもしれない。

using System.Collections.Generic;
using System;

namespace Std
{
    /// <summary>
    /// タスクマネージメントを提供します。
    /// </summary>
    /// <typeparam name="T">マネージする型</typeparam>
    public class TaskManager<T>
    {
        /// <summary>
        /// マネージ リスト
        /// </summary>
        List<T> Managing = new List<T>();

        /// <summary>
        /// 登録キュー
        /// </summary>
        Queue<T> AddQueue = new Queue<T>();
        /// <summary>
        /// 削除キュー
        /// </summary>
        Queue<T> RemoveQueue = new Queue<T>();

        /// <summary>
        /// マネージしているアイテム及び追加/削除キューをクリアします。
        /// </summary>
        public void Clear()
        {
            Managing.Clear();
            AddQueue.Clear();
            RemoveQueue.Clear();
        }

        /// <summary>
        /// タスク オブジェクトを列挙します。
        /// </summary>
        /// <returns></returns>
        public IEnumerable<T> EnumerateObjects()
        {
            return Managing;
        }

        /// <summary>
        /// タスクオブジェクトの個数を返します。
        /// </summary>
        public int Count
        {
            get
            {
                return Managing.Count;
            }
        }

        /// <summary>
        /// タスク追加キューにオブジェクトを登録します。
        /// </summary>
        /// <param name="obj">追加キューに登録するオブジェクト</param>
        public void EnqueueAdd(T obj)
        {
            AddQueue.Enqueue(obj);
        }

        /// <summary>
        /// タスク削除キューにオブジェクトを登録します。
        /// </summary>
        /// <param name="obj">削除キューに登録するオブジェクト</param>
        public void EnqueueRemove(T obj)
        {
            RemoveQueue.Enqueue(obj);
        }

        /// <summary>
        /// タスク追加キューと削除キューをコミットします。
        /// </summary>
        public void ApplyQueue()
        {
            while (AddQueue.Count > 0)
                Managing.Add(AddQueue.Dequeue());
            while (RemoveQueue.Count > 0)
                Managing.Remove(RemoveQueue.Dequeue());
        }

        /// <summary>
        /// タスクにオブジェクトをすぐに追加します。
        /// </summary>
        /// <remarks>
        /// EnumerateObjectsによってアイテムが列挙されている間にこのメソッドを実行すると、<para />
        /// InvalidOperationExceptionを引き起こす恐れがあります。
        /// </remarks>
        /// <param name="item">タスクに追加するオブジェクト</param>
        public void UnsafeAdd(T item)
        {
            Managing.Add(item);
        }

        /// <summary>
        /// タスクにオブジェクトコレクションをすぐに追加します。
        /// </summary>
        /// <remarks>
        /// EnumerateObjectsによってアイテムが列挙されている間にこのメソッドを実行すると、<para />
        /// InvalidOperationExceptionを引き起こす恐れがあります。
        /// </remarks>
        /// <param name="item">タスクに追加するオブジェクトコレクション</param>
        public void UnsafeAdd(IEnumerable<T> items)
        {
            Managing.AddRange(items);
        }

        /// <summary>
        /// タスクからオブジェクトをすぐに削除します。
        /// </summary>
        /// <remarks>
        /// EnumerateObjectsによってアイテムが列挙されている間にこのメソッドを実行すると、<para />
        /// InvalidOperationExceptionを引き起こす恐れがあります。
        /// </remarks>
        /// <param name="item">タスクから削除するオブジェクト</param>
        public void UnsafeRemove(T item)
        {
            Managing.Remove(item);
        }
    }
}