c# - 方法的扩展方法不在 IntelliSense 中显示

标签 c# .net function extension-methods timing

如何创建可以稍后执行给定函数的扩展方法?我想出了以下代码,但当您键入 MyFunc.DoLater() 时,它没有列在 IntelliSense 列表中。

我已经在静态类中声明了扩展方法...

using TTimer = System.Timers.Timer; // to prevent confusion with Windows.Forms.Timer

public static void DoLater(this Action handler, int delay) {
    TTimer timer = new TTimer(delay);
    timer.Elapsed += delegate {
       handler();
       timer.Dispose();
    };
    timer.Start();
}

... MyFunc 只是 Form 类中的一个方法,没有参数。

public void MyFunc(){
}

最佳答案

您需要一个 Action 实例来执行您的扩展方法:

var a = new Action(() => MyFunc());
a.DoLater();

但我会建议一种更好、更通用的方法:

public static class DoLaterExtension
{
    public static void DoLater<T>(this T x, int delay, Action<T> action)
    {
        // TODO: Impelement timer logic
        action.Invoke(x);
    }
}

private void Example()
{
    var instance = new MyForm();
    instance.DoLater(1000, x => x.MyFunc());
}

请记住,您最好使用 System.Windows.Fomrs.Timer 来避免线程问题。 或者 TPL 方式(如果您使用的是 .net 4.0,我会建议这样做)。

public static void DoLater<T>(this T x, int delay, Action<T> action)
{
    var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
    Task.Factory.StartNew(() =>
    {
        System.Threading.Thread.Sleep(delay);   
    }).ContinueWith(t =>
    {
        action.Invoke(x);
    }, scheduler);
}

如果您使用 .net 4.5,您甚至可以使用 Task.Delay http://msdn.microsoft.com/en-us/library/hh194845.aspx

关于c# - 方法的扩展方法不在 IntelliSense 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15404572/

相关文章:

c# - 在 C# 中获取服务器的时区偏移量

python - 变量和函数帮助//Python

Python凯撒函数错误输出

c# - 使用来自 VS.Net Designer 的绑定(bind)自动更新应用程序设置

c# - 在 C# 的同一类中的另一个委托(delegate)函数中使用两个委托(delegate)函数的返回 View

c# - "value"访问器中 "set"的数据类型是什么?

c# - 用于测量服务器响应时间的等效 Java 代码

c# - 使用一次性对象的回调取消操作的正确方法是什么?

c# - 如何在 C# 中使用 PHP CLI

javascript - jQuery 插件,从函数返回值