[英]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表達式將捕獲values
和task
,因此,當您調用Func<bool>
,它將把這些值提供給原始委托。
只要正確理解了您的問題,您就可以像普通電話一樣傳遞信息。 您是否考慮過使用Func? 您可以僅將參數傳遞給Task.Invoke
即Task.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.