使用lambda表达式

时间:2015-08-21 00:12:27

标签: c# lambda

我正在尝试构建重试逻辑,并且有兴趣将代码作为参数传递。我已经搜索了一些线程,但不知何故错过了连接这里的点。

样本B完全正常,样本A开始大喊大叫'无法从用法中推断出类型参数。我第一次尝试这个请在这里请耐心等待。

下面提到了重试代码。

尝试样本A的原因是因为我希望将Foo和Bar结合起来,这样它就可以发送一个代码块来重试,而不是一次调用函数。我在这里失踪的是什么?

    //SAMPLE A
    Retry.Do(() => {
        Foo();
        Bar(); 
        }, 120, 3);
    //SAMPLE B
    Retry.Do(() => Foo(), 120, 3);

    public static void Do<T>(
    Func<T> action,
    int RetryInterval,
    int RetryCount)
{

    Exception LastException = null;
    for (int retry = 0; retry < RetryCount; retry++)
    {
        try
        {
            Actions.FabricActions.Sleep(RetryInterval, "");
            action();
            return;
        }
        catch (Exception ex)
        {
            Logger.Exception(ex, "Exception encountered on retry attempt {0}", RetryCount);
            LastException = ex;
        }
    }

    if (LastException != null)
        throw LastException;
}

1 个答案:

答案 0 :(得分:2)

将签名更改为:

public static void Do(
    Action action,
    int RetryInterval,
    int RetryCount)
{
}

Func<T>表示您希望返回类型为T。您没有在方法中返回任何内容,因此无法编译。如果想要返回某些内容,请保持功能定义不变,但请确保在通话中返回,如下所示:

Retry.Do(() => {
        Foo();
        return Bar(); 
        }, 120, 3);

//This is only valid because it's short hand for 'return Foo();', since you don't have { }
Retry.Do(() => Foo(), 120, 3);
// Or
Retry.Do(() => { return Foo() }, 120, 3);
// Or with method groups (only valid for sample B)
Retry.Do(Foo, 120, 3);

请注意,如果 返回值,Do不是 - 那么您将丢弃返回值。这是否合适取决于你。但您可以更改Do以返回T,并执行此操作:return action();而非action();