Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
2 / 2 / 2
Регистрация: 16.06.2014
Сообщений: 70
1

Завершение задач при закрытии дочерней формы

18.07.2015, 04:06. Показов 1538. Ответов 3
Метки нет (Все метки)

Что мы имеем.

- дочерняя форма программы.
- мой класс, в котором реализована работа с Task-ами (ThreadController).

в этом классе:
- глобальная переменная CancellationTokenSource, используемая для завершения задач:
C#
1
2
3
4
5
public CancellationTokenSource TS = new CancellationTokenSource();
 
// запуск задачи выглядит так:
thisTask = Task.Factory.StartNew(() => speak.thisSpeaker.Passive(arg_Passive, arg_param),
                passiveTS.Token);
- метод для закрытия задач:
C#
1
2
3
4
        public void PassStop()
        {
            passiveTS.Cancel();
        }
в дочерней форме объявлен экземпляр ThreadController, и метод закрытия формы:

C#
1
2
3
4
5
6
7
8
9
10
11
        private void Window_Closed_1(object sender, EventArgs e)
        {
            try
            {
                parentWindow.Controller.PassStop();
            }
            catch
            {
 
            }
        }
При этом, все таски работают нормально, отладчиком проверял - до PassStop всё благополучно доходит, но форма закрывается, а таски продолжают работать. Может, я как-то не так их закрываю? Помогите, люди добрые)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2015, 04:06
Ответы с готовыми решениями:

Завершение процесса при закрытии дочерней формы
Много разных способов в интернете и мало толковых разъяснений. Подскажите как осуществить сие...

Ошибка при закрытии дочерней формы
Привет! Есть баг, который никак не могу исправить. Существуют 2 формы Form1 и Form2, при этом...

Обновление родительской формы при закрытии дочерней
Здрасте гуру! Есть такая проблема, пытаюсь обновить (перерисовать?) treeview в родительской форме...

Вызвать событие при закрытии дочерней формы
При закрытии дочерней формы мне нужно вызвать метод в главной форме. Подскажите как это сделать.

3
2403 / 1833 / 542
Регистрация: 02.08.2011
Сообщений: 5,154
18.07.2015, 06:10 2
Лучший ответ Сообщение было отмечено Kherson_IT как решение

Решение

Цитата Сообщение от Kherson_IT Посмотреть сообщение
thisTask = Task.Factory.StartNew(() => speak.thisSpeaker.Passive(arg_Passive, arg_param),
* * * * * * * * passiveTS.Token);
Если вы передаете токен отмены в подходящий конструктор Task-и, это не значит, что Task получает возможность быть отмененным. Код, который выполняется в Task-е, должен явно поддерживать отмену, то есть где-то в нем в случае для Task-ов должен периодически вызываться CancellationToken.ThrowIfCancellationRequested().

Добавлено через 18 минут
И при этом внешний код не узнает об отмене до тех пор, пока не будет вызван метод Task.Wait, либо будет сделана попытка прочитать свойство Task.Result (в случае с Task-ами, возвращающими значения). В этом случае файрится исключение AggregateException и в его свойстве InnerExceptions вам надо обрабатывать ваше OperationCanceledException.
Есть еще способ узнать об отмене операции: подписаться на событие TaskScheduler.UnobservedTaskException в потоке дочерней формы.
1
23 / 23 / 11
Регистрация: 04.12.2014
Сообщений: 395
18.07.2015, 06:38 3
Использую
Код
Form2 MyForm2 = new Form2();
MyForm2.ShowDialog();// Для создания и вызова формы
C#
1
this.hide(); //для скрытия формы2
вот управление
0
2 / 2 / 2
Регистрация: 16.06.2014
Сообщений: 70
18.07.2015, 07:25  [ТС] 4
Видимо, Вы не совсем поняли вопрос) но товарищ IamRain уже ответил

Добавлено через 8 минут
Цитата Сообщение от IamRain Посмотреть сообщение
Если вы передаете токен отмены в подходящий конструктор Task-и, это не значит, что Task получает возможность быть отмененным. Код, который выполняется в Task-е, должен явно поддерживать отмену, то есть где-то в нем в случае для Task-ов должен периодически вызываться CancellationToken.ThrowIfCancellationRequested().
В общем, вот так теперь выглядит метод, выполняющийся в задаче:
C#
1
public void Passive(windowPassive winPass, string[] arg_param, CancellationToken ct)
А вот так - создание самой задачи:
C#
1
th.thisTask = Task.Factory.StartNew(() => speak.thisSpeaker.Passive(arg_Passive, arg_param, passiveTS.Token), passiveTS.Token);
Поставил в теле метода
C#
1
ct.ThrowIfCancellationRequested();
Прохожусь по ним после вызова
C#
1
2
3
4
public void PassStop()
        {
            passiveTS.Cancel();
        }
Но, как ни странно, у токена свойство isCantellationRequested стоит в положении false, что я опять не так сделал?)

Добавлено через 7 минут
Оппа, заработало) всё, вопросов больше нет)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2015, 07:25

Как при закрытии дочерней формы обновить компоненты на родительской
Здравствуйте. Собственно есть дочерняя форма(запущена showdialog()) и на ней кнопка(close()). Как...

При закрытии дочерней формы, почемуто закрывается все приложение
В Programme.cs Application.Run(new Form6()); тоесть главная форма это форм 6. Но когда я пишу в...

Завершение потоков при закрытии формы
Я щелкаю на закрыть окно, а программа не выходит из Debug. Я понял, что я запускаю потоки, но не...

Завершение работы приложения при закрытии формы
Всем добрый день! У меня такая проблема, в методе одного класса мне надо открыть созданную форму...


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

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

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