我想要列出任务列表,然后对某个事件执行操作。代码:
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)。我的问题是如何将参数传递给任务队列的每个任务?
答案 0 :(得分:4)
好的,现在我们有更多的信息,听起来你的EnqueueTask
方法实际上应该是这样的:
public void EnqueueTask(Task task, object[] values)
右?
对于 starters ,我会避免使用名称Task
,它已经是.NET 4核心的一部分,并且在.NET中将成为非常的突出部分正如约书亚所说,你基本上得到了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>
时,它会将这些值提供给原始委托。
答案 1 :(得分:1)
正确理解您的问题,您只需像普通电话一样传递信息。你考虑过使用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;
}
}