powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как заставить таймер не выполняться, если предыдущее выполнение не завершено
5 сообщений из 5, страница 1 из 1
Как заставить таймер не выполняться, если предыдущее выполнение не завершено
    #38721329
crazyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Public Sub New()

' This call is required by the Windows Form Designer.
InitializeComponent()

' Add any initialization after the InitializeComponent() call.
t = New Timer(10000)
AddHandler t.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf Me.t_elapsed)
End Sub

Protected Sub t_elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs)
Try
Dim katalog
PrintLog2("Служба запущена" & Date.Now.Date.ToString())

katalog = ScreenDay("e:\SCREENSHOTS")
'Archive(katalog)
Catch ex As Exception
Dim path As String = "c:\logXXX.txt"
Dim tw As StreamWriter = New StreamWriter(path, True)
tw.WriteLine(ex.ToString)



Dim inner As Exception = ex.GetBaseException
tw.WriteLine(inner.Message.ToString)
tw.Close()
End Try

Таймер используется в сервисе, вб2010, как сделать так , чтобы он не выполнялся, пока не закончится предыдущее выполнение, а то ерунда вообще получается.
...
Рейтинг: 0 / 0
Как заставить таймер не выполняться, если предыдущее выполнение не завершено
    #38721336
Halfling
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crazyara, используйте вместо таймера цикл в фоновом потоке и Thread.Sleep(10000).
...
Рейтинг: 0 / 0
Как заставить таймер не выполняться, если предыдущее выполнение не завершено
    #38721345
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Использовать lock
2.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void t_Elapsed(...)
{
     if (_alreadyProcessing)
        return;
     _alreadyProcessing = true;
     .....
     _alreadyProcessing = false;
}
...
Рейтинг: 0 / 0
Как заставить таймер не выполняться, если предыдущее выполнение не завершено
    #38721448
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Можно внутри Elapsed в первой строке останавливать таймер, а в последней - снова запускать
...
Рейтинг: 0 / 0
Как заставить таймер не выполняться, если предыдущее выполнение не завершено
    #38721800
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crazyara, я бы завернул это в класс. Например, такой:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
class TimerAction : IDisposable
{
	private Timer _timer; // System.Threading.Timer
	private Action _userCallback;
	private readonly int _period;

	public TimerAction(Action callback, int period)
	{
		_userCallback = callback;
		_period = period;

		_timer = new Timer(TimerCallback, null, period, 0);
	}

	private void TimerCallback(object state)
	{
		_userCallback();
		_timer.Change(_period, 0);
	}

	public void Dispose()
	{
		if (_timer != null)
		{
			_timer.Dispose();
			_timer = null;
		}
		_userCallback = null;
	}
}


Мы пользуемся тем фактом что System.Threading.Timer дает возможность создат действие выполняющееся один раз. Как только оно заканчивается мы перезапускаем его. Таким обрзхом два действия никогда не наложатся друг на друга. Класс еще нужно улучшить добавив в него остановку действия.

Использование:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void Foo()
{
	TimerAction ta = new TimerAction(MakeScreenshot, 1000);
}

void MakeScreenshot()
{
	Debug.WriteLine("Делаем скриншот");
        // ...
}
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как заставить таймер не выполняться, если предыдущее выполнение не завершено
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]