C # Подписаться динамически анонимный метод - PullRequest
1 голос
/ 11 июня 2011

Здравствуйте, да, я задаю этот вопрос второй раз, извините за это, но я не знаю, как поднять предыдущий вопрос. Я объясню более подробно мою проблему в более законченном примере.

Вместо того, чтобы писать как 300+ Классы событий в 300 файлах классов, которые мне, возможно, придется сделать, если это не сработает, поэтому они могут выполнять небольшие синхронизированные задания, как, например, в этом примере ниже в серверном проекте.

Чего я пытаюсь избежать, так это написания нескольких классов и просто пишу все более компактно в структуре того, над чем я работаю.

Подводя итог, я смешиваю 90% функционального программирования и хочу дать некоторой функции какое-то отложенное временное событие, не создавая новое временное событие в отдельном классе, затем бегая туда-сюда по файлам, просматривая, как все связано вверх, но таким образом все можно увидеть, так что вы можете находить ошибки и еще много чего быстрее, так как все прямо перед вами, вроде как при написании кода цикла, но с задержкой.

Все, что у меня есть сейчас, - это один поток, который обрабатывает события, удаляет остановленные события, продолжает перезапускать события, которые не прекращаются после одного цикла, и, конечно, ждет, пока не будут запущены некоторые события.

Если кто-нибудь знает лучший способ сделать то, что я пытаюсь сделать, может быть, какая-то встроенная система событий C #? Что предпочтительно, просто.

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
}

class Test {
    string t;

    public void setT(string t) {
        this.t = t;
    }

    public void stuff() {
        Console.WriteLine(a);
    }
}

class ImportantWork {

    public static void Main(string[] args) {
        someDeepMethod();
    }

    void someDeepMethod() {
        Test t = new Test(); 
        t.setT("secondTime");

        //Here is where the problem occurs.

        Server.registerEvent(new Event(5000, () => {
                    this.stop();  //<-- Error how I call this from this new Event instance.
                    stop();  //<-- Also error
                    //Event.stop();  //<-- haha may work if it was static but thats stupid
                    t.stuff();
                    Console.WriteLine("thirdTime");
        }));

        t.setT("firstTime");
        t.stuff();
    }
}

Ожидаемый результат:
firstTime
... ждет 5 секунд ...
SecondTime
thirdTime

1 Ответ

1 голос
/ 11 июня 2011

Я не знаю, как вы могли бы сделать это встроенным, как это. Почему вы не можете использовать какую-то функцию set и сделать ее двумя строками?

MyEvent newEvent;
Server.registerEvent((newEvent = new MyEvent(5000)));
newEvent.setAction(() => {
                             newEvent.stop();
                             t.stuff();
                             Console.WriteLine("thirdTime");
                         });

Мне кажется, что в вашем дизайне есть какая-то структурная проблема. Я предполагаю, что приведенный вами пример был не совсем тем, с которым вы работали, а простым примером решения проблемы, с которой вы столкнулись. Если это, однако, пример, с которым вы работаете, почему бы вам просто не добавить логический флаг в конструктор, чтобы сообщить экземпляру, нужно ли вызывать this.stop () для себя - вместо того, чтобы требовать его, указанного в Действие

Удачи!

...