Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2014, 23:25   #1
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию Сокеты и многопоточность

Здравствуйте. Есть у меня такая проблема. Никак не могу понять как организовать выполнение 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, работает и ждет следующего подключения. Никак не могу понять как это сделать
Если у вас есть идея как эту логику реализовать по другому- напишите пожалуйста.
собственно сама логика: Этот кусок кода- это сервер. Клиент вводит креды и отправляет их серверу(сервер может обрабатывать подключения множества клиентов) далее сервер проверяет верные креды ли ввел пользователь. Никак не получается сделать это параллельно. Прошу совета.
123456789igor вне форума Ответить с цитированием
Старый 16.09.2014, 18:28   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Oops! Можно удалить, я случайно..

Последний раз редактировалось coNsept; 16.09.2014 в 18:34.
coNsept вне форума Ответить с цитированием
Старый 16.09.2014, 18:33   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Чувак у тебя там страшные вещи, форма когда загружается, твой первый цикл запускает бесконечное количество потоков, странно вообще как ты отписался здесь на форуме.
Достаточно одного цикла в потоке с подключением и биндингам к сокету так как ты будешь висеть на ss.Accept и прослушивать подключения и в момент когда клиент подключиться, ты уже сам решаешь обрабатывать твой результат в потоке или нет.
То есть тебе нужно сделать что-то вроде следующего:

Код:
private void Form1_Load(object sender, EventArgs e)
{
 Task.Factory.StartNew(() => 
  {
   Socket.Bind(...);
   Socket.Listen(...);

   while (true)
   { 
    var buffer = new byte[1024]; 
    var socket = Socket.Accept();  
    var bufferLen = clientSocket.Receive(buffer);

    if (bufferLen > 0)
    {
     Task.Factory.StartNew(() => 
      {
       db.isLogonOrRegistration(massOfWords);
      });
    }   
   }
  });
}
Как-то так..

Последний раз редактировалось coNsept; 16.09.2014 в 18:35.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность Fahman Общие вопросы Delphi 21 18.01.2014 12:59
Многопоточность nats C# (си шарп) 5 25.06.2011 11:51
Многопоточность boo_mago Общие вопросы C/C++ 7 21.03.2011 21:23
Многопоточность PUH Помощь студентам 3 06.06.2009 13:54