Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/2: Рейтинг темы: голосов - 2, средняя оценка - 5.00
maxkoshevoi
67 / 67 / 23
Регистрация: 07.11.2013
Сообщений: 539
1

Ошибка при закрытии соединения после завершения потока, где это соединение было открыто

08.11.2015, 23:32. Просмотров 434. Ответов 5
Метки нет (Все метки)

У меня в программе есть обновляющаяся статистика, и если пользователь запустил обновление, а потом поменял параметры статистики и запустил обновление ещё раз может случится так, что прошлое обновление ещё не завершилось. В таком случае, я завершаю поток с ним и запускаю новое обновление.
C#
1
2
3
4
5
6
7
if (update.IsAlive)
                {
                    update.Abort();
                    connect.Close();
                }
                update = new Thread(new ThreadStart(UpdateStat));
                update.Start();
Но вот в чём проблема, на сточке connect.Close(); всегда (или практически всегда) возникает ошибка:
Кликните здесь для просмотра всего текста
Исключение типа "System.TimeoutException" возникло в MySql.Data.dll, но не было обработано в коде пользователя

Дополнительные сведения: Не удается прочитать данные из транспортного соединения: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.

Если нажать "Продолжить", то возникнет новая ошибка: Ссылка на объект не указывает на экземпляр объекта., что странно, ведь переменная connect существует (она глобальная относительно этого окна). А если ещё раз нажать "Продолжить", то всё продолжится без какой-либо ошибки.

Добавлено через 1 час 48 минут
Блин... Совсем забыл про Join (ожидание завершения потока). Поправил код:
C#
1
2
3
4
5
6
7
8
if (update.IsAlive)
                {
                    update.Abort();
                    update.Join();
                    connect.Close();
                }
                update = new Thread(new ThreadStart(UpdateStat));
                update.Start();
И всё начало работать нормально =)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2015, 23:32
Ответы с готовыми решениями:

Ошибка при работе с БД: Подключение не было закрыто. Подключение открыто
Здравствуйте! Столкнулся с проблемой. Вскакивает ошибка при работе с БД, когда проект запускаю...

Ошибка при закрытии БД после выполнения отчета
Добрый день, помогите пожалуйста исправить ошибку. Проблема такая: После предварительного...

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

Вызов метода после завершения потока
Здравствуйте. Есть вот такой простой пример: private void Work() { ...

Как очистить память после завершения потока?
Как очистить память после завершения потока? Каждые 1000 мс поток запускается заново и занятая...

5
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
08.11.2015, 23:33 2
Поток должен завершаться сам. Нельзя прерывать.
0
maxkoshevoi
67 / 67 / 23
Регистрация: 07.11.2013
Сообщений: 539
09.11.2015, 01:00  [ТС] 3
nmcf, ну прям должен. А зачем тогда метод Abord() сделали? =) Просто у меня часто может наступать ситуация, когда ждать его завершения уже бессмысленно, а завершить его из него самого я не могу, так как он выполняет запрос, то есть завис на одной строчке. Так что приходится завершать его извне =)
0
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
09.11.2015, 09:36 4
При принудительной остановке потока может нарушиться целостность данных, не освободиться память и т. п.
Я потоки в C# особо не изучал, может, Abort() как-то эти вопросы решает, но по-правильному поток должен сам завершиться по сигналу.
0
Igr_ok
433 / 400 / 190
Регистрация: 04.08.2015
Сообщений: 1,094
09.11.2015, 10:04 5
Цитата Сообщение от maxkoshevoi Посмотреть сообщение
Если нажать "Продолжить", то возникнет новая ошибка: Ссылка на объект не указывает на экземпляр объекта., что странно, ведь переменная connect существует (она глобальная относительно этого окна).
Переменная существует, но ее значение может быть равно null. Возможно, это результат действия Abort(), может где-то в другом месте вашего кода влияет. Так что или убрать строку
C#
1
//connect.Close();
вообще или проверять
C#
1
2
if (connect!=null)
connect.Close();
0
maxkoshevoi
67 / 67 / 23
Регистрация: 07.11.2013
Сообщений: 539
14.11.2015, 18:10  [ТС] 6
Igr_ok, в своём коде я нигде не приравниваю connect к null. Как я уже сказал, видимо проблема была в том, что я пытался что-то делать с переменной, которая используется в другом потоке во время экстренного завершения этого потока. В такой ситуации с ней что угодно может происходить =) Так что, я просто дожидаюсь завершения потока, а потом уже делаю, что нужно.
0
14.11.2015, 18:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2015, 18:10

Как напечатать переменную 1 раз после завершения потока?
package com.company; class MyThread extends Thread { static int a = 0; public void...

Зависание при закрытии потока
Здравствуйте. Пишу небольшую сетевую программку. Решил использовать многопоточность в серверной...

Считывание из потока: "Запрос был прерван: Соединение было неожиданно закрыто"
Есть некий метод возвращающий поток: private static Stream GetSourceXml() { ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru