簡體   English   中英

將委托與參數一起傳遞給函數

[英]Pass delegate together with parameter to a function

我想排隊一個任務列表,然后在某些事件上執行。 碼:

internal class MyClass
{
    private Queue<Task> m_taskQueue;

    protected MyClass()
    {
        m_taskQueue = new Queue<Task>();
    }

    public delegate bool Task(object[] args);

    public void EnqueueTask(Task task)
    {
        m_taskQueue.Enqueue(task);
    }

    public virtual bool Save()
    {
        // save by processing work queue
        while (m_taskQueue.Count > 0)
        {
            var task = m_taskQueue.Dequeue(); 
            var workItemResult = task.Invoke();

            if (!workItemResult) 
            {
                // give up on a failure
                m_taskQueue.Clear();
                return false;
            }                
        }
        return true;
    }
}

每個委托任務可以具有自己的參數列表:Task(object [] args)。 我的問題是如何將參數傳遞給任務隊列的每個任務?

好的,現在我們有了更多信息,聽起來您的EnqueueTask方法應該看起來像這樣:

public void EnqueueTask(Task task, object[] values)

對?

首先,我會避免使用Task的名稱, Task已經是.NET 4核心的一部分,並且將在.NET 5中變得非常重要。正如Joshua所說,您基本上有了Func<object[], bool>

接下來,您可以保留兩個列表-一個用於委托人,一個用於值,但僅保留Queue<Func<bool>>這樣更容易:

private readonly Queue<Func<bool>> taskQueue = new Queue<Func<bool>>();


public void EnqueueTask(Task task, object[] values)
{
    taskQueue.Enqueue(() => task(values));
}

然后,您的其余代碼將實際上按“原樣”工作。 那里的lambda表達式將捕獲valuestask ,因此,當您調用Func<bool> ,它將把這些值提供給原始委托。

只要正確理解了您的問題,您就可以像普通電話一樣傳遞信息。 您是否考慮過使用Func? 您可以僅將參數傳遞給Task.InvokeTask.Invoke([arguments here as a *single* object array])

object[] arguments = null; // assign arguments to something
var workItemResult = task.Invoke(arguments);

以下是Func類型的示例。

internal class MyClass
    {
        private Queue<Func<object[], bool>> m_taskQueue;

        protected MyClass()
        {
            m_taskQueue = new Queue<Func<object[], bool>>();
        }



        public void EnqueueTask(Func<object[], bool> task)
        {
            m_taskQueue.Enqueue(task);
        }

        public virtual bool Save()
        {
            object[] arguments = null; // assign arguments to something
            // save by processing work queue
            while (m_taskQueue.Count > 0)
            {
                var task = m_taskQueue.Dequeue();
                var workItemResult = task(arguments);

                if (!workItemResult)
                {
                    // give up on a failure
                    m_taskQueue.Clear();
                    return false;
                }
            }
            return true;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM