4

QueueManagerというクラスを作成しました。

class QueueManager
{
    Queue functionsQueue;

    public bool IsEmpty 
    { 
        get 
            {
                if (functionsQueue.Count == 0)
                    return true;
                else
                    return false;
            }
    }

    public QueueManager()
    {
        functionsQueue = new Queue();
    }

    public bool Contains(Action action)
    {
        if (functionsQueue.Contains(action))
            return true;
        else 
            return false;
    }

    public Action Pop()
    {
        return functionsQueue.Dequeue() as Action;
    }

    public void Add(Action function)
    {
        functionsQueue.Enqueue(function);
    }

    public void Add(Func<CacheObject,Boolean> function)
    {
        functionsQueue.Enqueue(function);
    }

このクラスのインスタンスを作成してAddメソッドを呼び出すと、引数のない関数に対して正常に機能します。例:functionQueue.Add(Method); 、ただし、引数と戻り値(私の場合は引数としてClassType、戻り値としてブール値)を持つメソッドを呼び出す場合、たとえばfunctionQueue.Add(Method2(classObject)); コンパイルされません、何が欠けていますか?

4

1 に答える 1

13

なぜならfunctionQueue.Add(Method2(classObject))、通話自体ではなく、通話の結果をキューに入れるからです。

パラメータを使用してメソッドをエンキューするには、パラメータAddを受け入れるようにプロトタイプを変更する必要があります(そしてそれらをデリゲートと一緒に保存します)。別の方法として、ラムダを使用できます。

functionQueue.Add(() => Method2(classObject));

(次に、の2番目のオーバーロードは役に立たないので、クロージャー内のすべてのパラメーターを指定Addする場所をいつでもキューに入れることができます)。Action

更新
このタイプのキューの例はWinForms内にあり、メインスレッド以外のスレッドからのメソッドのディスパッチはメソッドキューを使用して行われます(の分解を見てくださいControl.MarshaledInvoke)。同期とコンテキストをスキップしてSystem.Collections.Queue、各エントリの場所ThreadMethodEntry(必要なデータを保持するために使用される構造)を保持します。

于 2012-05-23T09:45:56.693 に答える