Одно отличие состоит в том, что System.Threading.Timer
отправляет обратный вызов в поток пула потоков, а не создает каждый раз новый поток. Если вам нужно, чтобы это произошло более одного раза в течение жизни вашего приложения, это сэкономит накладные расходы на создание и уничтожение группы потоков (процесс, который очень ресурсоемкий, как указано в статье, на которую вы ссылаетесь), поскольку он будет просто повторно используйте потоки в пуле, и если у вас одновременно будет работать более одного таймера, это означает, что у вас будет меньше потоков, работающих одновременно (также экономя значительные ресурсы).
Другими словами, Timer
будет намного эффективнее. Это также может быть более точным, поскольку Thread.Sleep
гарантированно будет ждать МИНИМУМ столько времени, сколько вы укажете (ОС может перевести его в спящий режим намного дольше). Конечно, Timer
по-прежнему не будет точно точным, но цель состоит в том, чтобы запустить обратный вызов как можно ближе к указанному времени, тогда как это НЕ обязательно является целью Thread.Sleep
.
Что касается уничтожения Timer
, обратный вызов может принимать параметр, поэтому вы можете передать сам Timer
в качестве параметра и вызвать Dispose в обратном вызове (хотя я этого не пробовал - я думаю, возможно, что таймер может быть заблокирован во время обратного вызова).
Редактировать: Нет, я думаю, вы не можете этого сделать, так как вам нужно указать параметр обратного вызова в самом конструкторе Timer
.
Может быть, что-то вроде этого? (опять же, не пробовал)
class TimerState
{
public Timer Timer;
}
...и запустить таймер:
TimerState state = new TimerState();
lock (state)
{
state.Timer = new Timer((callbackState) => {
action();
lock (callbackState) { callbackState.Timer.Dispose(); }
}, state, millisecond, -1);
}
Блокировка должна предотвратить попытку обратного вызова таймера освободить таймер до того, как поле Timer
будет установлено.
Приложение: Как отметил комментатор, если action()
что-то делает с пользовательским интерфейсом, то, вероятно, лучше использовать System.Windows.Forms.Timer
, поскольку он будет запускать обратный вызов в потоке пользовательского интерфейса. Однако, если дело обстоит не так, и это до Thread.Sleep
против Threading.Timer
, Threading.Timer
- это путь.
person
Eric Rosenberger
schedule
24.12.2008