Простой метод вызывается снова после завершения - PullRequest
3 голосов
/ 16 сентября 2011

Справочная информация:

У меня есть метод, который выполняет некоторую обработку, которую я хотел бы вызывать снова и снова. Этот метод может занять от 50 до 200 мсек.

В настоящее время у меня есть System.Timers.Timer, который вызывает метод, когда он проходит каждые 250 мс. Я чувствую, что могу сделать это более эффективным, если сам метод «сработает» после его завершения.

Примечания:

  • Производительность имеет ключевое значение.
  • Два из этих методов не должны вызываться одновременно или перекрываться.

Я бы не хотел просто использовать цикл while, который вызывает метод. Он должен вызывать себя асинхронно, возможно, используя событие?

Вопрос:

Как я могу получить сам метод "триггер" после его завершения?

Ответы [ 4 ]

3 голосов
/ 16 сентября 2011

Вы можете выполнять цикл while в отдельном потоке выполнения, если вы принимаете необходимые меры предосторожности для многопоточности с такими вещами, как блокировки, переменные условия, дескрипторы ожидания и т. П.

  • C # Task Parallel Library может быть подходящим для этой работы.Но, как сказал Рид, обязательно используйте опцию создания LongRunning .Вот пример этого метода, опубликованный Ридом здесь .
  • Или используйте объект Thread напрямую.SLaks опубликовал пример этого метода здесь .

Если вы работаете с приложением WinForms, вы можете захотеть использовать BackgroundWorker .

1 голос
/ 16 сентября 2011

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

CancellationTokenSource cancel = new CancellationTokenSource();

Task.Factory
      .StartNew(() => PollHardware(cancel.Token), TaskCreationOptions.LongRunning)
      .ContinueWith(t =>
        {
            if (t.IsFaulted)
            {
                var aggException = t.Exception; // Keep task from pulling down AppDomain
                // Log/handle/etc
                LogException(aggException.InnerException);
            }
        });

Тогда все, что вам нужно, это метод обработки вашего цикла:

void PollHardware(CancellationToken token)
{
     while(true)
     {           
         token.ThrowIfCancellationRequested();
         YourMethod();
     }
} 

Если вы хотите, чтобы опрос прекратился, вы можете просто позвонить: cancel.Cancel().

1 голос
/ 16 сентября 2011
public delegate void MyDelegate(void);

void MyMethod()
{
  do stuff;
  this.Dispatcher.BeginInvoke(new MyDelegate(MyMethod), null);
}
1 голос
/ 16 сентября 2011

Создайте новый поток, который непрерывно вызывает ваш метод в цикле while.

void DoBackgroundPolling() {
    while(true) {
        try {
            YourMethod();
        } catch(Exception ex) {
            log error
        }
    }
}

new Thread(DoBackgroundPolling).Start()

Если вы хотите иметь возможность контролировать опрос, вы можете проверить логическое поле в этом методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...