windows form/wpf как закрыть потоки при закрытии формы?

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
Есть форма на wpf, все работает.
Для вызова кода по кнопке использую создание потока:

Код:
System.Threading.Tasks.Task.Run(() =>
{
//код
});
Проблема в том, что при закрытии формы, этот поток дальше продолжает работу, подскажите как пофиксить).
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
  • Спасибо
Реакции: Art4D

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
Просто эбортнуть поток, после закрытия формы:
https://msdn.microsoft.com/ru-ru/library/system.threading.thread.abort(v=vs.110).aspx
https://msdn.microsoft.com/ru-ru/library/system.threading.thread.currentthread(v=vs.110).aspx
Либо, заранее сохранять ссылку на его обьект, для abort'а.
Похоже это не работает:
Код:
Выполнение действия CSharp OwnCode Поток находился в процессе прерывания
Сам код:
Код:
var abc = Thread.CurrentThread;
abc.Abort();
А заранее сохранять ссылку как, я же ссылку эту в его потоке беру, как мне в основной поток это значение перенести?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
Так сохраняй в основном, до поднятия.
а можно пример? )) как же мы в основном узнаем, если поток еще не создан? я не очень силен в c#, поэтому такие глупые вопросы(.
 

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
В общем в OwnCodeUsings прописал:
C#:
static class GlobalVars
{
    public static System.Threading.Thread MyGlobalVar1;
}
И в самом кубике:
C#:
Mw.Pubbutton.Click+= delegate(object sender, RoutedEventArgs e) //обработчик кнопки
{
              System.Threading.Tasks.Task.Run(() =>
            {
                GlobalVars.MyGlobalVar1 = Thread.CurrentThread;
                //тут код потока
             });
          
Mw.ShowDialog(); //форма
GlobalVars.MyGlobalVar1.Abort(); //прерываем поток
}
Я пробовал создавать поток
C#:
var thread = new Thread(() =>{//тут код});
и его запускать, а потом абортить, но т.к. поток создается в "Mw.Pubbutton.Click+= delegate(object sender, RoutedEventArgs e)", то за ее пределами я не могу остановить поток т.к. переменная thread робит только там.

Кто знает получше способ, отпишите пж)
 
Последнее редактирование:

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
Запускайте фоновый поток
Код:
Thread th1 = new Thread(ваш метод);
th1.IsBackground = true;
th1.Start();
 
  • Спасибо
Реакции: Art4D

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
Запускайте фоновый поток
Код:
Thread th1 = new Thread(ваш метод);
th1.IsBackground = true;
th1.Start();
А вы сами пробовали свой способ?
Потому что насколько я понял это свойство "th1.IsBackground = true;" привязывается к зенке, а не шаблону, так что это не прокатит. System.Threading.Tasks.Task.Run по умолчанию имеет IsBackground = true и при закрытии шаблона/окна, поток не перестает работать. Такая же история и с созданными потоками, как в вашем примере.
Возможно я тут написал какую то дичь, т.к. c# очень поверхностно знаю.)
 
Последнее редактирование:

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
Все зависит от того как Вы запускаете форму и тд. Все фоновые потоки отрубаются при закрытии основного потока(выходе из приложения), в коде выше это работать не будет, так как поток запускается вне модального окна. Мне немного непонятна логика, поток запускается перед запуском модального окна, но должен завершиться после её закрытия, тогда запускайте поток внутри модального окна и там завершайте его.
 
  • Спасибо
Реакции: Art4D

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
Все зависит от того как Вы запускаете форму и тд. Все фоновые потоки отрубаются при закрытии основного потока(выходе из приложения), в коде выше это работать не будет, так как поток запускается вне модального окна. Мне немного непонятна логика, поток запускается перед запуском модального окна, но должен завершиться после её закрытия, тогда запускайте поток внутри модального окна и там завершайте его.
Да действительно, видимо я в прошлый раз делал что-то неверно с созданным потоком. Созданный поток, с параметром "IsBackground = true", завершается при закрытии формы.
В общем если кому интересно, код:

C#:
var Mw = new MainWindow(); //создаем wpf окно
Mw.Pubbutton.Click+= delegate(object sender, RoutedEventArgs e) //обработчик Mw.Pubbutton кнопки
{
    var thread = new Thread(() =>
    {
    //код который будет выполнятся по клику кнопки
    });
    thread.IsBackground = true;
    thread.Start();
};
Mw.Topmost = true; //делаем окно поверх зенно
Mw.Activate(); //делаем окно активным
Mw.ShowDialog(); //показываем окно
 
  • Спасибо
Реакции: Alexmd

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)