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

  • Автор темы Автор темы Art4D
  • Дата начала Дата начала

Art4D

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

Код:
Развернуть Свернуть Копировать
System.Threading.Tasks.Task.Run(() =>
{
//код
});

Проблема в том, что при закрытии формы, этот поток дальше продолжает работу, подскажите как пофиксить).
 
  • Спасибо
Реакции: Art4D
Просто эбортнуть поток, после закрытия формы:
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();

А заранее сохранять ссылку как, я же ссылку эту в его потоке беру, как мне в основной поток это значение перенести?
 
Так сохраняй в основном, до поднятия.
а можно пример? )) как же мы в основном узнаем, если поток еще не создан? я не очень силен в c#, поэтому такие глупые вопросы(.
 
В общем в 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 робит только там.

Кто знает получше способ, отпишите пж)
 
Последнее редактирование:
Запускайте фоновый поток
Код:
Развернуть Свернуть Копировать
Thread th1 = new Thread(ваш метод);
th1.IsBackground = true;
th1.Start();
 
  • Спасибо
Реакции: Art4D
Запускайте фоновый поток
Код:
Развернуть Свернуть Копировать
Thread th1 = new Thread(ваш метод);
th1.IsBackground = true;
th1.Start();
А вы сами пробовали свой способ?
Потому что насколько я понял это свойство "th1.IsBackground = true;" привязывается к зенке, а не шаблону, так что это не прокатит. System.Threading.Tasks.Task.Run по умолчанию имеет IsBackground = true и при закрытии шаблона/окна, поток не перестает работать. Такая же история и с созданными потоками, как в вашем примере.
Возможно я тут написал какую то дичь, т.к. c# очень поверхностно знаю.)
 
Последнее редактирование:
Все зависит от того как Вы запускаете форму и тд. Все фоновые потоки отрубаются при закрытии основного потока(выходе из приложения), в коде выше это работать не будет, так как поток запускается вне модального окна. Мне немного непонятна логика, поток запускается перед запуском модального окна, но должен завершиться после её закрытия, тогда запускайте поток внутри модального окна и там завершайте его.
 
  • Спасибо
Реакции: Art4D
Все зависит от того как Вы запускаете форму и тд. Все фоновые потоки отрубаются при закрытии основного потока(выходе из приложения), в коде выше это работать не будет, так как поток запускается вне модального окна. Мне немного непонятна логика, поток запускается перед запуском модального окна, но должен завершиться после её закрытия, тогда запускайте поток внутри модального окна и там завершайте его.
Да действительно, видимо я в прошлый раз делал что-то неверно с созданным потоком. Созданный поток, с параметром "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

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