10 / 10 / 1
Регистрация: 28.01.2012
Сообщений: 40
1

Как не используя таймер и потоки можно выставить таймаут метода

07.05.2012, 14:06. Показов 3509. Ответов 11
Метки нет (Все метки)

Люди, понимаю, что вопрос детский, но все-же. Как не используя таймер и потоки можно выставить таймаут метода. Тоесть:
C#
1
2
3
4
5
6
7
8
9
private void TaskWritInDB(Task task)
    {
...
      try
      {
...
                var unloadCashRequest = new UnloadCashRequest(dateBegin, dateEnd);
...
}
var unloadCashRequest = new UnloadCashRequest(dateBegin, dateEnd); - может "зависнуть", а мне надо чтобы при ее "зависании" более 5 минут программа просто выходила из TaskWritInDB и продолжала свою работу
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2012, 14:06
Ответы с готовыми решениями:

Как выставить таймер на закрытие программы?
как выставить таймер на закрытие программы через определенное время, через 25 минут

таймер и таймаут tcp проблема
короче, если не доступен порт на удаленном компьютере программа зависает на 30 секунд примерно,...

Таймаут для метода
В общем попытался написать таймаут для метода. То есть метод не должен работать по времени дольше,...

Как установить таймер на событие внутри метода?
Ребят, кто может подсказать, как установить таймер на событие внутри метода? private void...

11
398 / 365 / 54
Регистрация: 23.05.2010
Сообщений: 716
07.05.2012, 14:59 2
А как без таймера будешь определять время? Таймер в NET - это обёртка над системным таймером, вполне хорошо справляется с задачей отсчёта времени. Кидаешь его на форму или создаёшь в коде, запускаешь одновременно с методом и радуешься. Почему не подходит использовать таймер?
0
10 / 10 / 1
Регистрация: 28.01.2012
Сообщений: 40
07.05.2012, 15:11  [ТС] 3
Цитата Сообщение от Etrimus Посмотреть сообщение
А как без таймера будешь определять время? Таймер в NET - это обёртка над системным таймером, вполне хорошо справляется с задачей отсчёта времени. Кидаешь его на форму или создаёшь в коде, запускаешь одновременно с методом и радуешься. Почему не подходит использовать таймер?
Можно простенький пример с таймером приминительно к моему случаю? Хорошо, установлю срабатывание таймера на через 5 минут, повешу обработчик события срабатывания таймера, что в нем делать?
0
398 / 365 / 54
Регистрация: 23.05.2010
Сообщений: 716
07.05.2012, 16:06 4
А что за метод? Какой-то долгий цикл или что?
0
10 / 10 / 1
Регистрация: 28.01.2012
Сообщений: 40
07.05.2012, 16:21  [ТС] 5
Цитата Сообщение от Etrimus Посмотреть сообщение
А что за метод? Какой-то долгий цикл или что?
Ожидание данных от сервиса. Предупреждаю сразу - сервис никто переписывать не даст, он уже какой есть. Ситуация возникает в таком случае - сервис работает - я ему посылаю запрос - сервис ребутнули - моя программа ждет ответа, а у сервиса таска нету, получается "бесконечное ожидание".
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
07.05.2012, 18:23 6
Не знаю как работает ваш класс UnloadCashRequest, а точнее как реализовано само ожидание ответа, в общем я напишу пример а вы уже разберетесь, оно это или нет.
Например можно
C#
1
2
3
4
Thread thrd = new Thread(/* Ваш рапрос */);
thrd.Start();
endTime = Environment.TickCount + (1000 * 300);
while(Environment.TickCount < endTime || thrd.ThreadState != ThreadState.Running); //Ожидаем пока поток не остановится или не выйдет время
2
10 / 10 / 1
Регистрация: 28.01.2012
Сообщений: 40
07.05.2012, 19:00  [ТС] 7
Цитата Сообщение от Yukikaze Посмотреть сообщение
Не знаю как работает ваш класс UnloadCashRequest, а точнее как реализовано само ожидание ответа, в общем я напишу пример а вы уже разберетесь, оно это или нет.
Например можно
Спасибо за идею, с потоками я и сам представляю как делать. Интересно возможно ли это сделать без запихивания метода в отдельный поток.
0
398 / 365 / 54
Регистрация: 23.05.2010
Сообщений: 716
07.05.2012, 19:07 8
Цитата Сообщение от Yury_Prizrak Посмотреть сообщение
Интересно возможно ли это сделать без запихивания метода в отдельный поток.
Если не "оборачивать" метод в поток, то надо как-то остановить выполнение метода извне. Ну то есть сделать этому методу return не в самом методе, а в каком-то другом. По-мойму этого нельзя сделать более-менее тривиальным способом.

Добавлено через 2 минуты
Есть ещё в C# такая штука, как Рефлексия. Может с ней что-то можно замутить, но вроде как с её помощью только информацию можно получать, а не манипулировать.
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
07.05.2012, 19:20 9
Вот пример с StackOwerflow
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void CallWithTimeout(Action action, int timeoutMilliseconds)
    {
        Thread threadToKill = null;
        Action wrappedAction = () =>
        {
            threadToKill = Thread.CurrentThread;
            action();
        };
 
        IAsyncResult result = wrappedAction.BeginInvoke(null, null);
        if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
        {
            wrappedAction.EndInvoke(result);
        }
        else
        {
            threadToKill.Abort();
            throw new TimeoutException();
        }
    }
Вызываем наш метод
C#
1
2
TimeSpan time = TimeSpan.FromMinutes(5);
CallWithTimeout(/* Запрос */, time.Milliseconds);
Добавлено через 6 минут
Надо смотреть в сторону асинхронного программирования
1
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
24.11.2015, 14:00 10
Не большая поправка. При вызове параметр не:
C#
1
time.Milliseconds
а:
C#
1
Convert.ToInt32(time.TotalMilliseconds)
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
24.11.2015, 23:13 11
C#
1
2
3
4
5
6
7
8
9
private async void TaskWritInDB(Task task)
    {
...
      try
      {
...
                await var unloadCashRequest = new UnloadCashRequest(dateBegin, dateEnd);
...
}
тока unloadCashRequest тоже асинком объяви.
ну и почитай как-там с зависанием работать. (мож чё await придется вешать на какой нить Process).
0
TheGreatCornholio
1248 / 726 / 285
Регистрация: 30.07.2015
Сообщений: 2,403
25.11.2015, 11:44 12
Цитата Сообщение от Yury_Prizrak Посмотреть сообщение
Как не используя таймер и потоки
как сделать управляемую задержку
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2015, 11:44
Помогаю со студенческими работами здесь

Потоки. Как из одного потока вызвать выполнение метода в другом потоке
Необходимо 50 раз в секунду выполнять методы в двух параллельно работающих потоках...

Как, используя таймер обновлять SqlDataSource
Добрый день, уважаемые форумчане. Как , используя таймер обновлять SqlDataSource? protected...

Как используя потоки читать файл пропуская текстовые вставки
Есть поток привязанный к файлу на чтение и запись. Каждая строка в файле имеет формат: сс:мм:чч...

Таймер и параллельные потоки
Добрый день, сразу оговорюсь, что прошёлся поиском по темам с запросом &quot;таймер&quot;, &quot;потоки&quot; и т.д. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru