Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты и многопоточность 
:(
    Опции темы
123456789igor
Дата 15.9.2014, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011

Репутация: нет
Всего: нет



Здравствуйте. Есть у меня такая проблема. Никак не могу понять как организовать выполнение 2х различных задач параллельно. 
Есть клиент-серверное приложение. 1 метод отвечает за ожидание подключения и прием данных, 2ой метод отвечает за действия над принятыми данными.
Выглядит это так
Код

private async void Form1_Load(object sender, EventArgs e)
        {
            while (true)
            {
                new Thread(() => Run()).Start();
            }
            while (true)
            {
                if (massOfWords[0] != "")
                    break;
            }
            WorkWithDB db = new WorkWithDB();
            new Thread(() =>db.isLogonOrRegistration(massOfWords)).Start();

        }
public async Task Run()
        {
            massOfWords = await StartServer();
        }

public async Task<String[]> StartServer()
        {
            Socket _server;
            IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            //ServerSocket ss = new ServerSocket(ipAddress, 11000);
            _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _server.Bind(new IPEndPoint(ipAddress, 11000));
            _server.Listen(20);
            ServerSocket ss = new ServerSocket();
            string result = await ss.Accept(_server);
            Console.WriteLine(result);
            _server.Close();
            _server.Dispose();
            return result.Split('|');
        } 


В результате хочу получить что-то вроде: запускаем приложение, метод Run запускается в новом потоке(выполнение программы идет дальше) программа крутится в цикле, пока какой-то клиент не подключится и не передаст данные. В случае если что-то получили запускаем метод isLogonOrRegistration в ещё 1ом потоке, при этом поток, в котором Run, работает и ждет следующего подключения. Никак не могу понять как это сделать
Если у вас есть идея как эту логику реализовать по другому- напишите пожалуйста. 
собственно сама логика: Этот кусок кода- это сервер. Клиент вводит креды и отправляет их серверу(сервер может обрабатывать подключения множества клиентов) далее сервер проверяет верные креды ли ввел пользователь. Никак не получается сделать это параллельно. Прошу совета.
PM MAIL   Вверх
Ilya81
Дата 17.9.2014, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

Репутация: нет
Всего: 4



Хоть с использованием оператора await я ещё не полностью освоился, но всё равно полагаю, что ожидающий поток - не самое подходящее для него применение. Рекомендую использовать EventWaitHandle с автоматическим сбросом. Т. е. ожидающий поток считывает все данные, после чего, пройдя цикл, останавливается на WaitOne. При чьём-то подключении вызывается метод Set и данные вновь считываются, затем поток вновь ждёт. Примерно так:
Код

        private volatile bool _isActive = true;
        private readonly EventWaitHandle _waitIncoming = new EventWaitHandle(false, EventResetMode.AutoReset);

        private void Loop()
        {
            while (_isActive)
            {
                ReadData();
                if (_isActive)
                    _waitIncoming.WaitOne();
            }
        }

Метод Loop выполняется в некотором потоке.
PM MAIL ICQ Skype   Вверх
WERITAS
Дата 29.10.2014, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: 3
Всего: 5



Класс EventWaitHandle используют пул потоков CLR,  а в нём их число ограниченно (по-моему 25). Поэтому если подключаться более 25-ти клиентов, то 26-му придётся ждать пока поток в пуле не освободится. Серверную часть приложения, работающего со множеством подключений, делают через Thread. А пул потоков используют для совершенно других задач по распараллеливанию!


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Cheloveck
Дата 29.10.2014, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Как-то так...

Код

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleCs {
    public class Program {
        static ConcurrentBag<string> lines = new ConcurrentBag<string>();

        public static void Main(string[] args) {
            Listen();
            Console.Write("Press any key...");
            Console.ReadKey();
        }
        static void Listen() {
            while(true) {
                Console.Write("> ");
                string line = Console.ReadLine();
                if(String.Equals("q", line, StringComparison.InvariantCultureIgnoreCase)) {
                    PrintLines();
                    return;
                }
                HandleAsync(line);
            }
        }
        static void HandleAsync(string data) {
            new Task(() => {
                Thread.Sleep(2000); // Эмуляция бурной деятельности
                lines.Add(data);
            }).Start();
        }
        static void PrintLines() {
            Console.WriteLine("Entered strings:\n");
            foreach(string line in lines) {
                Console.WriteLine(line);
            }
        }
    }
}


Никаких асинков и эвейтов не надо тут, на вроде как.

Это сообщение отредактировал(а) Cheloveck - 29.10.2014, 16:12


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.