Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 25.02.2018
Сообщений: 11

Завершение процесса после закрытия формы

30.09.2018, 23:22. Показов 2345. Ответов 3

Студворк — интернет-сервис помощи студентам
Пишу приложение-клиент, которое принимает файлы по протоколу UDP. Хотелось бы, чтобы при закрытии формы завершался и процесс. Однако с использованием кода ниже этого не происходит.
Уже решил проблему, использовав Task receiveTask вместо Thread receiveTask (при этом надобность в bool alive для проверки отпадает). Тем не менее хотелось бы узнать какой-то изящный метод решения, применимый для потоков.
P.S. Использование receiveTask.IsBackground = true также помогает, но, насколько я понял, подобный ход приемлем только в крайнем случае.
Заранее спасибо.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
namespace WindowsFormsApp11
{
    public partial class Form1 : Form
    {
        const int localPort = 5002;
        UdpClient client;
        FileStream fs;
        string path;
        Thread receiveTask;
        bool alive = true;
 
        public Form1()
        {
            InitializeComponent();         
            receiveTask = new Thread(receive);
            receiveTask.Start();
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            alive = false; 
        }
 
        void receive()
        {
            try
            {
                while (alive)
                {
                    IPEndPoint end = null;
                    client = new UdpClient(localPort);
 
                    byte[] metainfo = client.Receive(ref end);
 
                    Invoke(new MethodInvoker(() =>
                    {
                        richTextBox1.Clear();
                        richTextBox1.Text = "Получение информации о входящем файле... \r \n";
                    }));
 
                    string message = Encoding.Unicode.GetString(metainfo);
                    string[] forcreate = message.Split('/');
                    DialogResult answer = MessageBox.Show(forcreate[0] + '.' + forcreate[1] + "\nРазмер: " 
                        + forcreate[2] + "\nХотите принять его?", "Информация о входящем файле", 
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
 
                    if (answer == DialogResult.Yes)
                    {
                        Invoke(new MethodInvoker(() =>
                        {
                            richTextBox1.AppendText("Получение файла... \r \n");
                            saveFileDialog1.FileName = forcreate[0];
                            saveFileDialog1.DefaultExt = forcreate[1];
                            if (saveFileDialog1.ShowDialog() == DialogResult.Cancel) return;
 
                            path = saveFileDialog1.FileName;                          
                        }));            
 
                        byte[] file = client.Receive(ref end);
                        fs = new FileStream(path, FileMode.Create,
                            FileAccess.ReadWrite, FileShare.ReadWrite);
                        fs.Write(file, 0, file.Length);
                        fs.Close();
 
                        Invoke(new MethodInvoker(() =>
                        {
                            richTextBox1.AppendText("Файл сохранен. \r \n");
                        }));
                    }
                    else
                    {
                        Invoke(new MethodInvoker(() =>
                        {
                           richTextBox1.AppendText("Файл был отклонен. \r \n");
                        }));
                    }
                  client.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка при получении");
            }
            finally
            {
                if (fs != null) fs.Close();
            }
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2018, 23:22
Ответы с готовыми решениями:

Завершение процесса Excel после обработки файла
Доброго времени суток, Подскажите пожалуйста, как завершить процесс Excel после использования? Вот что я делаю: ...

Завершение процесса при обнаружении другого процесса
Здравствуйте. Люди добрые подскажите пожалуйста как мне быть. Есть приложение которое следит за процессами в диспетчере, запущены 2...

Запись не сохраняется после закрытия формы
Нужна помощь в базе данных MS Access вот код. Новая запись выводится и добавляется но она не сохраняется при закрытии формы. Что нужно...

3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.10.2018, 01:02
Цитата Сообщение от green lizard Посмотреть сообщение
Использование receiveTask.IsBackground = true также помогает, но, насколько я понял, подобный ход приемлем только в крайнем случае.
Кто вам такое сказал? Свойство IsBackground именно для того и нужно, что бы поток завершался при завершении процесса.
0
1 / 1 / 0
Регистрация: 25.02.2018
Сообщений: 11
01.10.2018, 16:18  [ТС]
Storm23, Завершение потоков, после закрытия формы
Совсем рядом.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.10.2018, 19:29
Лучший ответ Сообщение было отмечено green lizard как решение

Решение

green lizard,
Смотрите, давайте не путать теплое с мягким. Я конечно понимаю, что имел ввиду kolorotur, когда пишет про то что прервать поток это как выдернуть шнур из розетки. Этого нельзя делать если у вас идет какая-то обработка данных. То есть например, вы начали писать что-то в базу данных, и бах, поток завершился. Половина записей попало в БД, половина - нет. В результате БД оказывается в неопределенном состоянии.
Но у вас поток в 99 случаев из 100 будет находится в строке client.Receive. То есть будет ожидать входящие пакеты. Причем эта операция блокирующая и ее нельзя прервать извне. И в этом случае нет ничего плохого в том, что бы использовать IsBackground для выхода из потока.
Если хотите, можете переводить в состояние IsBackground в момент client.Receive и выводить из этого состояния в момент обработки данных, то есть вот так:
C#
1
2
3
4
5
6
7
while(true)
{
   IsBackground = true;
   client.Receive();
   IsBackground = false;
   //обработка....
}
Либо же, использовать асинхронные версии client.Receive, которые позволяют делать прерывание.

В любом случае, не нужно впадать в крайности и догматизм. Меня зацепила фраза "IsBackground = true приемлем только в крайнем случае". IsBackground применим вполне себе во многих случаях, все зависит от контекста. Если где-то пишут про то, что IsBackground использовать нельзя, goto это плохо, преждевременная оптимизация - это ужас и т.п., то нужно понимать почему это нельзя делать, а не бездумно выполнять. И тогда окажется что каждое блюдо подходит к своему обеду.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2018, 19:29
Помогаю со студенческими работами здесь

IntelliTrace остается в процессах после закрытия программы. Правильное завершение программы?
Много (очень много) раз запускал программу, закрывал через крестик. Вдруг винда сообщает, что виртуальная память вся забита (8к). Открываю...

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

Завершение процесса после работы с SerialPort
Добрый день, подскажите пожалуйста. Не завершает процесс (то есть висит) после работы с com портом. Открываю порт, читаю данные, закрываю...

Сохранение данных после закрытия формы
Всем доброго времени суток. Меня интересует вопрос: можно ли сохранить данные после закрытия формы например в текст боксе написано...

Как выполнить функцию после закрытия второй формы
Здравствуйте! Ну вообщем такой вопрос :)


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru