将委托与参数一起传递给函数

Ice*_*man 3 c# parameters delegates

我想排队一个任务列表,然后在某个事件上执行。代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

每个委托任务可能有自己的参数列表:Task(object[] args)。我的问题是如何将参数传递给任务队列的每个任务?

Jon*_*eet 5

好的,现在我们有了更多信息,听起来您的EnqueueTask方法实际上应该是这样的:

public void EnqueueTask(Task task, object[] values)
Run Code Online (Sandbox Code Playgroud)

对?

对于初学者,我会避免使用名称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));
}
Run Code Online (Sandbox Code Playgroud)

然后您的其余代码实际上将“按原样”工作。那里的 lambda 表达式将捕获valuestask,因此当您调用 时Func<bool>,它会将这些值提供给原始委托。