2012-02-10 131 views
2

我想排队一个任务列表,然后在某些事件上执行。代码:将代表与参数一起传递给一个函数

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

每个代表任务可以有自己的参数列表:任务(对象[]参数)。我的问题是如何将参数传递给任务队列的每个任务?

+2

传递哪个参数?你还没有真正解释你想要做什么... – 2012-02-10 23:21:38

+0

@Jon,在问题中澄清。 – Icerman 2012-02-10 23:28:31

+1

不是......你说过每个任务都有它自己的参数列表,但是你没有说什么关于你希望从那里获取数据的地方。 – 2012-02-10 23:29:21

回答

4

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

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

,对吗?

对于首先我会避免使用名称Task,这已经是.NET 4的核心组成部分,将成为非常在.NET 5.突出正如约书亚说,你已经基本上得到了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>时,它会将这些值提供给原始代理。

+0

是的,那是我的意图。这正是我需要的。一个未成年人,我认为Add()需要被Queue()取代。 – Icerman 2012-02-11 00:01:53

+0

@Icerman:是的,完成了。 – 2012-02-11 07:53:28

1

只要正确理解您的问题,您就可以像普通电话那样传递信息。你有没有考虑过使用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; 
     } 
    } 
+0

我的问题是保持来自调用者的Enqueue()参数,然后将这些任务与传递的参数一起处理。 – Icerman 2012-02-10 23:40:36

+0

参数是函数签名的一部分,您不会将参数传递给函数。参数是您调用函数时传递的实际“值”。你的意思是你想保存论据和电话吗?如果是这种情况,只需将Delegate和object []数组放在一个新类中,然后Enqueue该新类的一个实例,然后在Dequeue使用该类中的对象[]调用该委托之后。 – 2012-02-10 23:45:42

+0

是的,论点就是我的意思。你的建议是我在其他样本中看到的。想知道是否有其他方法。 – Icerman 2012-02-10 23:52:53

相关问题