调整Invoke调用以满足返回void和non-void类型的方法

时间:2015-02-05 16:56:57

标签: c#

如何调整以下Invoke调用以满足返回void和非void类型的方法?

目前ErrorHandlingComponent.Invoke期望Func<T>作为其第一个参数。我发现当我试图传递一个void方法时,编译器会抱怨。

    public static T Invoke<T>(Func<T> func, int tryCount, TimeSpan tryInterval)
    {
        if (tryCount < 1)
        {
            throw new ArgumentOutOfRangeException("tryCount");
        }

        while (true)
        {
            try
            {
                return func();
            }
            catch (Exception ex)
            {
                if (--tryCount > 0)
                {
                    Thread.Sleep(tryInterval);
                    continue;
                }
                LogError(ex.ToString());
                throw;
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

你不能。 Func委托的设计使其始终返回一些内容。

最简单的方法是创建Invoke方法的重载,该方法需要Action代理而不是Func

public static void Invoke(Action action, int tryCount, TimeSpan tryInterval)
{
    if (tryCount < 1)
    {
        throw new ArgumentOutOfRangeException("tryCount");
    }

    while (true)
    {
        try
        {
            action();
            return;
        }
        catch (Exception ex)
        {
            if (--tryCount > 0)
            {
                Thread.Sleep(tryInterval);
                continue;
            }
            LogError(ex.ToString());
            throw;
        }
    }       
}