Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как заставить таймер не выполняться, если предыдущее выполнение не завершено / 5 сообщений из 5, страница 1 из 1
15.08.2014, 15:02
    #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
15.08.2014, 15:11
    #38721336
Halfling
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить таймер не выполняться, если предыдущее выполнение не завершено
crazyara, используйте вместо таймера цикл в фоновом потоке и Thread.Sleep(10000).
...
Рейтинг: 0 / 0
15.08.2014, 15:18
    #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
15.08.2014, 16:42
    #38721448
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить таймер не выполняться, если предыдущее выполнение не завершено
Можно внутри Elapsed в первой строке останавливать таймер, а в последней - снова запускать
...
Рейтинг: 0 / 0
16.08.2014, 21:00
    #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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как заставить таймер не выполняться, если предыдущее выполнение не завершено / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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