将参数传递给操作调度程序

时间:2016-08-10 14:55:14

标签: c# factory-pattern

我有一个从队列中调度Actions的类。但是,我的InvokeLater只接受Action,没有任何参数。

这是我的Dispatcher

public class Dispatcher : MonoBehaviour
{
    private static readonly Queue<Action> tasks = new Queue<Action>();
    public static Dispatcher Instance = null;

    static Dispatcher()
    {
        Instance = new Dispatcher();
    }

    private Dispatcher(){ }

    public void InvokeLater(Action task)
    {
        lock (tasks)
        {
            tasks.Enqueue(task);
        }
    }

    void FixedUpdate()
    {
        while (tasks.Count > 0)
        {
            Action task = null;

            lock (tasks)
            {
                if (tasks.Count > 0)
                {
                    task = tasks.Dequeue();
                }
            }

            task();
        }
    }
}

我这样用:

var action = new Action(RequestPrediction);
Dispatcher.Instance.InvokeLater(action);

其中RequestPrediction是无参数函数 - 我想改变它以使它(RequestPrediction)采用int参数。

如何更改Dispatcher以便我可以执行以下操作:

var action = new Action(RequestPrediction);
Dispatcher.Instance.InvokeLater(action,5);

2 个答案:

答案 0 :(得分:4)

最简单的解决方案:

<file src="bin\Release\<name>.dll" target="lib\net20"/>

否则,您必须开发框架,并且最终会看到类似于现有Amazon Cognito Identity API documentation或现有TPL library in .NET的内容。哪些是其他更好的建议。

答案 1 :(得分:1)

使用lambda函数。它将自动转换为Action。而不是

var action = new Action(RequestPrediction);
Dispatcher.Instance.InvokeLater(action);

您可以使用

Action action = () => RequestPrediction();
Dispatcher.Instance.InvokeLater(action);

或者如果您更喜欢隐式类型的局部变量(var关键字):

var action = new Action(() => RequestPrediction());
Dispatcher.Instance.InvokeLater(action);

这样,您可以在调用站点中添加参数:

Action action = () => RequestPrediction(5);
Dispatcher.Instance.InvokeLater(action);

或者

var action = new Action(() => RequestPrediction(5));
Dispatcher.Instance.InvokeLater(action);