2012-02-10 132 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

相關問題