延迟后C#执行方法

时间:2019-02-27 12:29:53

标签: c#

我想创建一个接收方法作为参数并延迟var的方法。并在延迟后执行该方法:

    public static void performSelectorAfterDelay<T>(Action<T> method, T parameter, double delay)
    {
        Thread thread = new Thread(delegate()
        {
            Thread.Sleep(TimeSpan.FromSeconds(delay));
            uc.BeginInvoke((Action)(() => method(parameter)));
        });
        thread.Start();
    }

我希望它是通用的,因此我可以为这两种方法调用它:

    public void funcA()
    {

    }

    public void funcB(int num)
    {

    }

当我打电话时:

performSelectorAfterDelay(new Action(funcA), null, kSecondsWaitAfterTransferToFollowersPage);
performSelectorAfterDelay(new Action(funcB), 5, kSecondsWaitAfterTransferToFollowersPage);

我收到此错误:

  

不能从用法中推断方法performSelectorAfterDelay(System.Action,T,double)的类型参数。尝试显式指定类型参数。

有什么问题吗?

2 个答案:

答案 0 :(得分:1)

编译器无法计算出类型,因为您要传递null作为第二个参数。

performSelectorAfterDelay(new Action(funcA), null, kSecondsWaitAfterTransferToFollowersPage);

无论如何,在解决该问题后,您将最终遇到另一个错误,因为funcB占用了int,因此由于new Action的要求,它无法传递给Action无参数方法。

根据其他答案,您也许可以使用Action<object>使其正常工作,但这意味着您不能离开funcA而没有参数。但是,除非我误解了,否则此解决方案对我来说似乎是多余的。您可以传递一个实际的操作,该操作使用其参数调用funcA / funcB,如下所示:

public void performSelectorAfterDelay(Action method, double delay)
{
    Thread thread = new Thread(delegate ()
    {
        Thread.Sleep(TimeSpan.FromSeconds(delay));
        method();
    });
    thread.Start();
}

public void test()
{
    performSelectorAfterDelay(() => funcA(), kSecondsWaitAfterTransferToFollowersPage);
    performSelectorAfterDelay(() => funcB(1), kSecondsWaitAfterTransferToFollowersPage);
}

答案 1 :(得分:0)

该错误消息说明了什么。 这是固定版本的先生:

10
相关问题