代码之家  ›  专栏  ›  技术社区  ›  YosiFZ

延迟后的C#Winform执行方法

  •  0
  • YosiFZ  · 技术社区  · 7 年前

    我想创建一个方法,它接收方法作为参数和延迟变量,并在延迟之后执行该方法:

        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的类型参数(系统动作,T,double)“”无法从用法中推断。尝试显式指定类型参数。

    0 回复  |  直到 7 年前
        1
  •  1
  •   djdd87    7 年前

    编译器无法计算出类型,因为您将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);
    }
    
        2
  •  0
  •   koviroli    7 年前

    先生,这是固定版本:

        public static void funcA(object obj)
        {
        }
    
        public static void funcB(int num)
        {
        }
    
        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 static void SomeCall()
        {
            performSelectorAfterDelay(new Action<object>(funcA), null, kSecondsWaitAfterTransferToFollowersPage);
            performSelectorAfterDelay(new Action<int>(funcB), 5, kSecondsWaitAfterTransferToFollowersPage);
        }
    
    推荐文章