Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как лучше выйти из метода по истечении времени? 
:(
    Опции темы
Stas123
Дата 14.7.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Есть метод, который выполняет работу, если он не выполнил работу за время t, он должен прекратить работу и вернуть управление.
Сечас я реализовал это вот так, но я не уверен, что это лучший способ.
Код

private decimal DoAggressiveRegime()
            {
                DateTime timeAtStart = DateTime.Now;
                while(true)
                {
                    //do work
                    if(DateTime.Now.AddMinutes(-2) >= timeAtStart ){ break;}
                }
                return res;
            }

Как грамотнее это сделать?

Это сообщение отредактировал(а) Stas123 - 14.7.2011, 18:42
PM MAIL   Вверх
AlexNagits
Дата 14.7.2011, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



В случае WinForms DoAggressiveRegime() будет "замораживать" окно, пока не вернет управление. Я бы рекомендовал многопоточность (using System.Threading.Tasks), т.к. отзывчивый интерфейс сейчас в моде smile

Суть:
Код

Task task1 = new Task(delegate
            {
                //Do work
                Thread.Sleep(5000);

                //Update GUI
                this.Invoke((MethodInvoker)delegate
                {
                    richTextBox1.AppendText("Ололо!");
                });
            });
task1.Start();

int ЖдемМиллисекундНаВыполнение = 1000;
bool МетодВыполнилсяДоКонца = task1.Wait(ЖдемМиллисекундНаВыполнение);

if(МетодВыполнилсяДоКонца)
 MessageBox.Show("Метод выполнился до конца!");


Но task1.Wait замораживает программу, как и while(true), пока не выполнится task1 или не пройдет 1000 мс.

Поэтому задействовать надо 2 дополнительных потока, вместо одного:
Код

            Task task1 = new Task(delegate
            {
                //Do work
                Thread.Sleep(5000); 

                //Update GUI
                this.Invoke((MethodInvoker)delegate
                {
                    richTextBox1.AppendText("Ололо!");
                });
            });

            Task task2 = new Task(delegate
            {
                int ЖдемМиллисекундНаВыполнение = 1000;
                bool МетодВыполнилсяДоКонца = task1.Wait(ЖдемМиллисекундНаВыполнение);
                this.Invoke((MethodInvoker)delegate
                {
                    if(МетодВыполнилсяДоКонца)
                         MessageBox.Show("Метод выполнился до конца!");
                });
            });

            task1.Start();
            task2.Start();


Это сообщение отредактировал(а) AlexNagits - 14.7.2011, 20:13
PM MAIL   Вверх
Stas123
Дата 15.7.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Спасибо.
У меня все это происходит в BackgroundWorker, в WPF, так что заморозки интерфейса не происходит.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.