C#:是否内置了等效的Func<> / Action<>存储函数指针以及状态?

时间:2011-04-04 19:26:14

标签: c# delegates

我希望在计时器刻度中重复调用具有相同参数的相同函数。我不想将这些参数作为类变量存储在表单中,因为它不需要更改。

我目前的解决方案是:

    /// <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()”由每个tick上的计时器调用。是否有与此相当的内置语言?

谢谢!另外,如果问题不明确,请告诉我。

编辑:我想在没有lambda表达式的情况下这样做。

4 个答案:

答案 0 :(得分:3)

这不仅仅是闭包的本质吗?

Action MakeIssuer(SomeParam param)
{
    Action issuer = () => DoSomeWork(param);   
    return issuer;
}

答案 1 :(得分:1)

你可以捕获它们:

int i = 5;
myTimer.Tick += (s, e) => doStuff(i);

答案 2 :(得分:1)

您没有说明您正在使用什么类型的计时器。既然你提到表格,我会假设你的意思是System.Windows.Forms.Timer。您可以设置Timer的Tag属性来保存值。然后,每当tick事件发生时,您都可以从该属性中获取值。

如果您正在使用System.Threading.Timer,则可以将状态信息作为第二个参数传递给计时器构造函数。该信息将作为State参数传递给计时器回调。

似乎没有办法将状态信息传递给System.Timers.TimerElapsed事件处理程序。

答案 3 :(得分:0)

如果毫秒足够接近精确度,那么Timer类将为您提供帮助。作为构造函数的一部分,您提供了在间隔出现时调用的方法。