2016-08-10 3 views
1

У меня есть класс, который отправляет 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); 

?

+0

общий класс действия '' действий '' –

ответ

4

Простейшее решение:

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

В противном случае, вы должны развивать свою базу и вы бы в конечном итоге с чем-то, который пытается выглядеть как существующий TPL library in .NET или существующий Dispatcher implementation. Какие другие, даже лучшие предложения.

+0

Fantastic! Спасибо огромное! – pookie

1

Используйте лямбда-функцию. Он будет автоматически преобразован в Action. Вместо

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

Вы можете использовать

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

Или, если вы предпочитаете неявно типизированные локальные переменные (вар ключевое слово):

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); 
+1

Спасибо, это правильно! Однако BartoszKP добрался до него, P – pookie

Смежные вопросы