powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск по таймеру не более одной Task
25 сообщений из 34, страница 1 из 2
Запуск по таймеру не более одной Task
    #39553411
Евгенич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таймер. По таймеру нужно проверять не запущена ли уже задача, если запущена, не делать ничего, если не запущена - запускать. Как это можно сделать правильно? (.net 4.0)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private void timer_Tick(object sender, EventArgs e)
        {
            
            if ()--нужно проверить есть ли уже запущенные task
            {
                Task tsk = new Task(delegate() { Work(); });
                tsk.Start();
            }        
            
        }
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553419
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Евгенич,

Определить Task на уровне приложения-формы и проверять свойство IsCompleted
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553438
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгенич,
Второй вариант- завести флаг в форму bool яПростаиваюИскучаю.
Потоки флаг меняют.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553468
Евгенич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Евгенич,

Определить Task на уровне приложения-формы

Так ведь task нельзя запускать вновь, можно лишь пересоздавать и запускать. Или я неправильно понял совет?
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553541
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгенич,
System.threading.Timer.
И не надо более ничего. ))
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553582
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгенич,

его можно и не завершать :) но это плохая практика
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553632
Евгенич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Евгенич,
System.threading.Timer.
И не надо более ничего. ))
А он умеет выполнять назначенный ему код в отдельном потоке? (нужно чтобы основной поток не мерз). И кроме того метод, который я ему передам требует входной параметр. А в описании System.Threading.Timer говорят, что параметр передаваемого метода должен быть типа object - а у меня SQLConnection. Как его использовать?
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553644
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгенич,
У меня работает.
Коннект внутри создай.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553792
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ЕвгеничТак ведь task нельзя запускать вновь, можно лишь пересоздавать и запускать. Или я неправильно понял совет?
Неправильно.
В Вашем примере таск определен внутри timer_Tick и поэтому его нельзя проверить во время следующего входа в timer_Tick .

В принципе так тоже можно , но надо как-то хранить Id процесса в какой-то глобальной переменной.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553794
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ЕвгеничА в описании System.Threading.Timer говорят, что параметр передаваемого метода должен быть типа object - а у меня SQLConnection. Как его использовать?

Просто сделать

Код: c#
1.
SqlConnection con = param as SqlConnection
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553797
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Хозяйке на заметку.
Если надо передать много аргументов, то они передаются в виде структуры
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553829
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгенич,

ВСЕ объекты в языке ООП CSharp унаследованы от типа Object.
Если в качестве аргумента указан тип object, это значит, что можно передать совершенно любой объект
Почитай, что такое Boxing\Unboxing.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39553995
Евгенич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Неправильно.
В Вашем примере таск определен внутри timer_Tick и поэтому его нельзя проверить во время следующего входа в timer_Tick .


Сделал так:

объявил tsk за пределами цикания таймера:
Код: c#
1.
private Task tsk;


а затем
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 private void timer_Tick(object sender, EventArgs e)
        {

            if (tsk.IsCompleted)
            {
                tsk = new Task(delegate() { Work(conn); });
                tsk.Start();
            }        
            
        }



Теперь ругачка Object Reference not set to an instance of an object
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554005
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгенич,
У драйвера бд работает пул коннектов. Соединение происходит мгновенно.
Кроме того в поток нужен новый коннект.
Т.е. передавать нет необходимости.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554006
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгеничСделал так:

объявил tsk за пределами цикания таймера:
Код: c#
1.
private Task tsk;


tsk изначально null, а ты это не проверяешь.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554016
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554029
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Евгенич,
System.threading.Timer.
И не надо более ничего. ))Надо. Он не проверяет завершённость предыдущего срабатывания.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554032
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPetro123Евгенич,
System.threading.Timer.
И не надо более ничего. ))Надо. Он не проверяет завершённость предыдущего срабатывания.
Что там что тут нужен флаг.
Только поток тот таймер делает сам.
Т.е. код короче.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554056
Евгенич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Ttsk изначально null, а ты это не проверяешь.

Переделал, один фиг та же ошибка
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private void timer_Tick(object sender, EventArgs e)
        {
           
            if ((tsk == null)|((tsk!=null)&(tsk.IsCompleted)))
            {
                tsk = new Task(delegate() { Work(conn); });
                tsk.Start();              
            }
                           
        }



Подскажите как правильно, плиз!
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554064
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так написать:
Код: c#
1.
            if (tsk == null || tsk.IsCompleted) ...
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554069
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
volatile bool IsExecutionInProcess;

async void Timer1_Tick(object sender, EventArgs e)
{
    if (IsExecutionInProcess)
        return;

    IsExecutionInProcess = true;
   
    try
    {
        await Task.Run(() => { /*  Тут делаем нашу работу. */ }).ConfigureAwait(false);
    }
    finally
    {
        IsExecutionInProcess = false;
    }
}
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554071
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volatile можно убрать...
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554075
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей Кпропущено...
Надо. Он не проверяет завершённость предыдущего срабатывания.
Что там что тут нужен флаг.Да. :-)
Petro123Только поток тот таймер делает сам.
Т.е. код короче.Ну недостатки тоже есть. Если GUI приложение, то я бы использовал GUI-таймер. Если служба или консольное приложение, тогда Threading-таймер.
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554105
Евгенич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
volatile bool IsExecutionInProcess;

async void Timer1_Tick(object sender, EventArgs e)
{
    if (IsExecutionInProcess)
        return;

    IsExecutionInProcess = true;
   
    try
    {
        await Task.Run(() => { /*  Тут делаем нашу работу. */ }).ConfigureAwait(false);
    }
    finally
    {
        IsExecutionInProcess = false;
    }
}



так не могу (task.run нету в .net 4.0) в принципе уже сделал сделал тупо через bool флаг. спасибо!
...
Рейтинг: 0 / 0
Запуск по таймеру не более одной Task
    #39554109
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгенич,
Я выше удивился, что за проблема включить галку проекте хоть на net6.
Автоматом меняются все ссылки.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск по таймеру не более одной Task
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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