c# - 将委托(delegate)与参数一起传递给函数

标签 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;
    }
}

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

最佳答案

好的,现在我们有了更多信息,听起来像您的 EnqueueTask方法实际上应该如下所示:

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

对吗?

对于初学者,我会避免使用名称 Task ,它已经是 .NET 4 核心的一部分,并将在 .NET 5 中变得非常突出。正如 Joshua 所说,您基本上已经得到了 Func<object[], bool> .

接下来,您可以保留两个列表 - 一个用于委托(delegate),另一个用于值,但仅保留 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> 时,它将把这些值提供给原始委托(delegate)。

关于c# - 将委托(delegate)与参数一起传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9236200/

相关文章:

c# - 序列化时不忽略在 DefaultValue 中声明的数组

objective-c - 从 swift 到 Objective-C 单例的参数

c - 将各种参数从 C 传递到汇编器

ios - 无法将 ViewController 类型的值分配给 UITextFieldDelegate 类型的值?

c# - 修改 ISAPI 和 CGI​​ 扩展

c# - ASP.NET Core 5 错误 “An error occurred while processing your request”

c# - 可空结构与类

python - 如何降低计算成本

swift - 我的委托(delegate)方法变成了 nil 而它不应该吗?

swift - "Optional type '(()-> boolean )? ' cannot be used as a boolean; test for ' != nil ' instead"在委托(delegate)函数调用中