Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: завершение потока, с шарп  (Прочитано 5923 раз)
0 Пользователей и 1 Гость смотрят эту тему.
xelos
Гость
« : 12-12-2004 20:44 » 

в общем есть такой трабл.
есть класс, устанавливающий соединение через сокет. На сокет вешаю два стрима - на чтение и на запись (StreamWriter и StreamReader).
стрим на чтение зацикливаю на считывание строки в отдельном потоке.

все работает отлично до завершения программы. Поскольку объект класса с сокетом создается в классе формы, необходимо завершить поток при выходе из приложения. Ставил стандартный деструктор в классе с сокетом: ~IRCConnection() - управление в него никогда не передается Жаль

пробовал из класса формы в методе Dispose завершить поток через метод Abort - не завершается...

может кто подскажет в чем трабл? Стримы, кстати, тоже надо как-то закрывать, или они сами закроются?
Записан
Serega
Гость
« Ответ #1 : 13-12-2004 09:50 » 

Потоки(threads) лучше завершать естественным образом
лучше использовать флаг, но можно и Abort(MSDN)

Деструктор вызывается только когда происходит чистка мусора, при завершениии приложения машина просто возвращает память системе

Цитата: MSDN
When you are finished sending and receiving data, use the Shutdown method to disable the Socket. After calling Shutdown, call the Close method to release all resources associated with the Socket.


При закрытии потоков ввода/вывода вызывается метод flush, полезно если потоки буферизирующие

Цитата: MSDN
A call to Close is required for proper operation of a stream. Following a call to Close, other operations on the stream could throw exceptions. If the stream is already closed, a call to Close throws no exceptions.
Записан
xelos
Гость
« Ответ #2 : 14-12-2004 13:45 » 

упс, куда-то все делось?Не понял
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-12-2004 17:45 » 

видимо, переехал сайт, могу повторить

нить - это поток команд, часто содержит цикл вида
Код:
...
while(!flag)
{
...
}
...
isclosed = true;
return;
управление через флаг - банальная установка flag = true. Тогда нить естественным образом завершится. Для гарантированного завершения дочерних нитей жди в главной нити установки флага isclosed. Это общее решение, специфики .NET в данном вопросе не знаю.
« Последнее редактирование: 03-12-2007 16:46 от Алексей1153++ » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
xelos
Гость
« Ответ #4 : 14-12-2004 21:28 » 

повторюсь, я делаю так:
Код:

public void Connect()
{
try
{
client=new TcpClient();
client.Connect(host,port);
ns=client.GetStream();

Encoding enc=Encoding.GetEncoding(1251);

rs=new StreamReader(ns,enc);
ws=new StreamWriter(ns,enc);

receiver = new Thread(new ThreadStart(ListenForMessages));
receiver.Start();
threadStarted=true;

}
catch (SocketException)
{

}
}
private void ListenForMessages()
{
while (threadStarted)
{
try
{
Rmessage=rs.ReadLine();
}
catch (Exception e)
{
string s=e.Message;
}

if (Rmessage!=null)
{
Message(Rmessage);
if (Rmessage.StartsWith("PING"))
{
SendLine("PONG");
}
}
}
rs.DiscardBufferedData();
rs.Close();
ws.AutoFlush=true;
ws.Close();
ns.Flush();
ns.Close();
client.Close();

}
public void Stop()
{
threadStarted=false;
if (receiver.ThreadState==ThreadState.Running)
                                  receiver.Abort();
}
метод Stop() вызываю из формы при ее закрытии, проблема в линии:
Rmessage=rs.ReadLine();
нить блокирована ожиданием строки.
сообщения приходят асинхронно - т.е. непостоянно. И получается, что при вызове Stop нить не завершается в течение 20 секунд примерно. Вопрос теперь сводится к тому, как корректно мгновенно завершить потоки и нить.
« Последнее редактирование: 03-12-2007 16:49 от Алексей1153++ » Записан
Serega
Гость
« Ответ #5 : 15-12-2004 08:39 » 

Смотри NetworkStream: BeginRead/EndRead и BeginWrite/EndWrite
Записан
xelos
Гость
« Ответ #6 : 15-12-2004 11:47 » 

это, вроде, для асинхронных сокетов... у меня пока все через синхронные работает...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines