C#动态订阅匿名方法

C#动态订阅匿名方法,c#,visual-studio,visual-studio-2010,lambda,anonymous-methods,C#,Visual Studio,Visual Studio 2010,Lambda,Anonymous Methods,你好,是的,我第二次问这个问题,很抱歉,但我不知道如何反驳前面的问题。我将用一个更完整的例子更深入地解释我的问题 而不是在300个类文件中编写300多个事件类,如果这样做不起作用,我可能不得不这样做,这样他们就可以在服务器项目中执行类似下面的示例作业这样的小时间作业 我试图避免的是编写一堆类,而只是简单地将所有内容编写得更加紧凑,无论我在做什么 总而言之,我混合了90%的函数式编程,希望给一些函数一些延迟的定时事件,而不是在单独的类中创建新的定时事件,然后在文件中来回运行,查看所有内容是如何连接

你好,是的,我第二次问这个问题,很抱歉,但我不知道如何反驳前面的问题。我将用一个更完整的例子更深入地解释我的问题

而不是在300个类文件中编写300多个事件类,如果这样做不起作用,我可能不得不这样做,这样他们就可以在服务器项目中执行类似下面的示例作业这样的小时间作业

我试图避免的是编写一堆类,而只是简单地将所有内容编写得更加紧凑,无论我在做什么

总而言之,我混合了90%的函数式编程,希望给一些函数一些延迟的定时事件,而不是在单独的类中创建新的定时事件,然后在文件中来回运行,查看所有内容是如何连接的,但是通过这种方式,所有的东西都可以被看到,这样你就可以更快地发现bug等等,因为所有的东西都在你面前,有点像编写循环代码,但是会有延迟

我现在所拥有的只是一个线程,它处理事件,删除已经停止的事件,继续重新运行在一个周期后不会停止的事件,当然还要等待一些事件可以运行

如果有人知道一个更好的方法来做我想做的事情,也许是一些内置的C#Event系统?这最好是简单的

class Event {
    private Action action;
    private bool stopped;

    public Event(long tick, Action action) {
        this.tick = tick;
        this.action = action;
        this.lastRun = Environment.TickCount;
    }

    public void stop() {
        stopped = true;
    }

    public bool canRun() { //blah ignore just showing what I plan to do
        if (stopped)
            return false;
         return (Environment.TickCount - lastRun) > tick;
    }

    public void run() {
          this.lastRun = Environment.TickCount;
        action();
    }

    //... other methods
}

类重要网络{
公共静态void Main(字符串[]args){
方法();
}
void方法(){
测试t=新测试();
t、 setT(“第二次”);
//这就是问题所在。
Server.registerEvent(新事件(5000,()=>{

this.stop();//我不知道你怎么能像那样内联完成。为什么不能使用某种set函数并将其设为两行呢

MyEvent newEvent;
Server.registerEvent((newEvent = new MyEvent(5000)));
newEvent.setAction(() => {
                             newEvent.stop();
                             t.stuff();
                             Console.WriteLine("thirdTime");
                         });
在我看来,您的设计似乎存在某种结构性问题。我假设您提供的示例不是您实际使用的示例,只是一个简单的示例来解决您遇到的问题。但是,如果是,您正在使用的示例为什么不在构造函数中添加一个布尔标志来告诉是否对自身调用this.stop(),而不是要求在操作中指定它


祝你好运!

我不知道你怎么能像那样内联完成。为什么你不能使用某种set函数并将其设为两行呢

MyEvent newEvent;
Server.registerEvent((newEvent = new MyEvent(5000)));
newEvent.setAction(() => {
                             newEvent.stop();
                             t.stuff();
                             Console.WriteLine("thirdTime");
                         });
在我看来,您的设计似乎存在某种结构性问题。我假设您提供的示例不是您实际使用的示例,只是一个简单的示例来解决您遇到的问题。但是,如果是,您正在使用的示例为什么不在构造函数中添加一个布尔标志来告诉是否对自身调用this.stop(),而不是要求在操作中指定它


祝您好运!

名称“stop”在当前上下文中不存在。(删除该名称不会更改任何内容)名称“stop”在当前上下文中不存在。(删除该名称不会更改任何内容)嘿,这还不算太糟,没那么想该死!哈哈哈。没问题。是的,我不知道有什么方法可以在构造函数参数中引用一个尚未创建的实例。谢谢mrazza。这与其说是一个强制操作,不如说是一个结构问题。有些事件必须保持更长的时间间隔,而不仅仅是5秒d dispose event..但可能是5次..然后dispose..在上面的示例中..我只运行一次..在其他事件中,我甚至可能不需要包含stop();(并不是说我不包含stop()的事件是永久的..在其他事件中会有一些条件语句调用stop())啊。有道理,是的,我看到了这个问题。我希望这对你有用。想一想..如果我注册的事件在生成setAction()代码之前运行会怎么样..我猜setAction()是必须有一个触发器才能使活动安全运行。啊,见鬼,似乎已经足够好了。现在不能继续处理同一个问题3天了,哈哈,我还有很多其他问题要处理。再次感谢。嘿,这还不算太糟,别那样想。该死!哈哈,没问题。是的,我不知道有什么方法可以引用非yet在其构造函数参数内创建了实例。感谢mrazza..它不像强制操作那样是一个结构性问题..某些事件..必须保持更长的时间间隔,不仅仅是5秒和dispose event..还可能是5次..然后dispose..在上面的示例中..我只运行一次..在其他事件中,我甚至不必包含ude stop();(不是说我不包括stop()的那些是永久的。在其他事件中会有一些条件语句调用stop())啊。有道理,是的,我看到了问题。我希望这对你有用。当考虑到这一点时..如果我注册的事件在生成setAction()代码之前运行会怎么样..我猜setAction()必须有一个触发器才能使活动安全运行。啊,该死的,似乎已经足够好了。现在不能继续处理同一个问题3天了,哈哈,我还有很多其他问题要处理。再次感谢。
MyEvent newEvent;
Server.registerEvent((newEvent = new MyEvent(5000)));
newEvent.setAction(() => {
                             newEvent.stop();
                             t.stuff();
                             Console.WriteLine("thirdTime");
                         });