Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
1

Как правильно завершить поток сервера?

10.07.2017, 15:27. Показов 1706. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        {
 
            Listener = new TcpListener(Settings.ip, Settings.port); // Создаем "слушателя" для указанного порта
            Listener.Start(); // Запускаем его
            Settings.state = "Включен";
            // В бесконечном цикле
            while (true)
            {
                // Принимаем нового клиента
                TcpClient Client = Listener.AcceptTcpClient();
                // Создаем поток
                Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
                // И запускаем этот поток, передавая ему принятого клиента
                Thread.Start(Client);
            }
Подскажите, как мне завершить 1 поток сервера и все потоки клиентов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2017, 15:27
Ответы с готовыми решениями:

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

Как правильно завершить поток без исключения ThreadInterruptedException?
В общем, есть отдельный проект dll-ки с компонентом, наследующим MonthCalendar. В нем дополнительно...

Как правильно завершить поток (программа часы в Label)
Здравствуйте, есть простая многопоточная программа - на форме в Label отображается время (программа...

Как завершить поток?
Проблема в том, что создается поток, который нужно завершить нажатием кнопки public void...

9
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
10.07.2017, 16:22 2
Просто интересно, через сколько милисекунд у Вас количество потоков превысит максимум и вылетит ексепшн?
П.С. - работу оного не проверял, но создание Thread-ов в цикле - ну как-то не то.
1
653 / 589 / 171
Регистрация: 17.07.2012
Сообщений: 1,670
Записей в блоге: 1
10.07.2017, 16:29 3
FastMailSend, почитайте про Паттерны Асинхронного программирования. Советую выбрать один(последний) и его использовать для ваших клиент-серверов.
1
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
10.07.2017, 17:14  [ТС] 4
Отсюда взял этот код:
https://habrahabr.ru/post/120157/
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
10.07.2017, 17:50 5
Цитата Сообщение от FastMailSend Посмотреть сообщение
Отсюда взял этот код:
https://habrahabr.ru/post/120157/
И вас не смутило, что статья 2011 года, а также, что к ней куча критических комментариев?
1
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
10.07.2017, 19:21 6
hoolygan, AcceptTcpClient этот метод лочит управление
FastMailSend, Использовать токен отмены и юзать задачи что то в этом роде

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
public class ServerWrapper : IDisposable
    {
        private readonly TcpListener _listener;
        private CancellationToken _token;
        private CancellationTokenSource _tokenSource;
 
        public ServerWrapper(IPAddress address, int port) => _listener = new TcpListener(address, port);
 
        public void Dispose() => Stop();
 
        public event EventHandler<DataReceivedEventArgs> OnDataReceived;
 
        public async Task StartAsync(CancellationToken? token = null)
        {
            _tokenSource = CancellationTokenSource.CreateLinkedTokenSource(token ?? new CancellationToken());
            _token = _tokenSource.Token;
            _listener.Start();
 
            try
            {
                while (!_token.IsCancellationRequested)
                    await Task.Run(async () =>
                    {
                        var tcpClientTask = _listener.AcceptTcpClientAsync();
                        var result = await tcpClientTask;
                        OnDataReceived?.Invoke(this, new DataReceivedEventArgs(result.GetStream()));
                    }, _token).ConfigureAwait(false);
            }
            finally
            {
                _listener.Stop();
            }
        }
 
        public void Stop() => _tokenSource?.Cancel();
 
        public class DataReceivedEventArgs : EventArgs
        {
            public DataReceivedEventArgs(NetworkStream stream) => Stream = stream;
 
            public NetworkStream Stream { get; }
        }
    }
1
214 / 210 / 146
Регистрация: 20.11.2014
Сообщений: 1,161
10.07.2017, 21:13 7
_exp10der_, а можете подсказать пожалуйста как всю эту красоту запускать, где обрабатываются принятые сообщения и как отправить ответ клиенту?
1
214 / 210 / 146
Регистрация: 20.11.2014
Сообщений: 1,161
13.07.2017, 20:39 8
актуально. Кто-нибудь может помочь и подсказать как использовать код выше?
1
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
16.07.2017, 18:06 9
bbq, Это пример на коленке что бы показать что надо принимать в метод CancellationToken и внутри проверять на отмену.
1
214 / 210 / 146
Регистрация: 20.11.2014
Сообщений: 1,161
17.07.2017, 22:45 10
_exp10der_, у меня сейчас сервер выглядит так:

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
public class ClientObject
    {
        private TcpClient client;
        public ClientObject(TcpClient tcpClient)
        {
            client = tcpClient;
        }
        static public string answer = "";
        public void Process()
        {
            NetworkStream stream = null;
            try
            {
                stream = client.GetStream();
                byte[] data = new byte[128]; // буфер для получаемых данных
                while (true)
                {
                    // получаем сообщение
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (stream.DataAvailable);
                    string message = builder.ToString();//полученное сообщение
 
                    ParseMessage.Parse(message);
 
                    data = Encoding.Unicode.GetBytes(answer);
                    stream.Write(data, 0, data.Length);
                    answer = "";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (stream != null)
                    stream.Close();
                if (client != null)
                    client.Close();
            }
        }
    }
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
static TcpListener listener =  new TcpListener(IPAddress.Parse("127.0.0.1"), 8005);
        void start(int a)
        {
            Thread clientThread = new Thread(new ThreadStart(startS));
            if (a == 1)
            {
                clientThread.Start();
            }
            else
            {
                clientThread.Abort();
                listener.Stop();
            }
        }
        void startS()
        {
            try
            {
                listener.Start();
                //listBox1.Items.Add("Ожидание подключений...");
                while (true)
                {
                    TcpClient client = listener.AcceptTcpClient();
                    ClientObject clientObject = new ClientObject(client);
                    Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
                    clientThread.Start();
                }
            }
            catch //(Exception ex)
            {
                //listBox1.Items.Add(ex.Message);
            }
            finally
            {
                if (listener != null)
                    listener.Stop();
            }
        }
Как то можно сюда приделать Ваш пример, или надо все с нуля переписывать?
1
17.07.2017, 22:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2017, 22:45
Помогаю со студенческими работами здесь

Как завершить поток в программе
нужно завершить поток в программе который принимает синхронно подключение(acept()) Abort...

Потоки. Как завершить поток через N sec?
Приветствую! Собственно, возникла проблема с завершением работы потока в котором задействован метод...

Как завершить текущий поток? Что-то вроде GetCurrentThread().Abort()
Нашел, что процесс убивается так: System.Diagnostics.Process.GetCurrentProcess().Kill(); Возможно...

Завершить поток while
Всем привет. Суть такова. Запретить вход пользователю в диспетчер задач. Отлавливаю горячие...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru