C #: есть ли встроенный эквивалент Func <> / Action <>, который хранит указатель на функцию, а также состояние? - PullRequest
0 голосов
/ 04 апреля 2011

Я хочу вызывать одну и ту же функцию с одними и теми же параметрами несколько раз в таймере таймера.Я не хочу хранить эти параметры как переменные класса в форме, поскольку их не нужно изменять.

Мое текущее решение:

    /// <summary>
/// This class is designed to bundle in data with a function pointer.
/// The function pointer is intended to be called repeatedly after leaving the context of the initial parameters.
/// </summary>
public class FunctionPointerWithState
{
    /// <summary>
    /// The function pointer to call when issuing a search.
    /// </summary>
    private Action<object> Issuer;

    /// <summary>
    /// The parameter to send.
    /// </summary>
    private object Param;


    /// <summary>
    /// Creates a new object with the appropriate state.
    /// </summary>
    public SingleLobBurstSearch( Action<object> issuer, object prm )
    {
        Issuer = issuer;
        Param = prm;
    }


    /// <summary>
    /// Calls the stored function pointer with the stored state.
    /// </summary>
    public void IssueRequest()
    {
        Issuer( Param );
    }
}

"IssueRequest ()" вызываетсяпо таймеру на каждом тике.Есть ли встроенный языковой эквивалент этого?

Спасибо!Также, пожалуйста, дайте мне знать, если вопрос не ясен.

РЕДАКТИРОВАТЬ: Я хотел бы сделать это без лямбда-выражений.

Ответы [ 4 ]

3 голосов
/ 04 апреля 2011

Разве это не суть замыкания?

Action MakeIssuer(SomeParam param)
{
    Action issuer = () => DoSomeWork(param);   
    return issuer;
}
1 голос
/ 04 апреля 2011

Вы не говорите, какой тип таймера вы используете.Поскольку вы упоминаете формы, я предполагаю, что вы имеете в виду System.Windows.Forms.Timer.Вы можете установить свойство Timer Tag для хранения значений.Затем, всякий раз, когда происходит событие тика, вы можете получить значения из этого свойства.

Если вы используете System.Threading.Timer , вы можете передать информацию о состоянии в качестве второго параметраконструктор таймера.Эта информация будет передана в качестве параметра State для обратного вызова таймера.

Похоже, способа передачи информации о состоянии в обработчик события Elapsed для System.Timers не существует.Таймер .

1 голос
/ 04 апреля 2011

Вы можете захватить их:

int i = 5;
myTimer.Tick += (s, e) => doStuff(i);
0 голосов
/ 04 апреля 2011

класс Timer доставит вас туда, если миллисекунды достаточно близки для вас. В качестве части конструктора вы предоставляете метод для вызова при наступлении интервала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...