Как ThreadPool работает с переданными переменными - PullRequest
0 голосов
/ 29 мая 2020

Я сейчас пытаюсь принимать входящие соединения через пул потоков, и все это работает, но возникает следующий вопрос:

Что, если я получу новое соединение до того, как пул потоков обработает предыдущее. Объект передается функции, в данном случае клиент, заменен новым соединением, или он запомнит оба?

причина, по которой я думаю, что он забывает первого клиента, заключается в том, что переданная переменная - это просто ссылка?

Код выглядит так:

public static void Initialize()
    {
        socket.Start();

        System.Threading.Thread newConnection = new System.Threading.Thread(() =>
        {
            while (isOnline)
            {
                System.Net.Sockets.TcpClient client = socket.AcceptTcpClient();
                System.Threading.ThreadPool.QueueUserWorkItem(HandleNewClient, client);
            }
        })
        {
            IsBackground = true,
            Name = "newConnection",
            Priority = System.Threading.ThreadPriority.Highest
        };
    }

Надеюсь, это прояснило вам, ребята. Заранее благодарим за внимание.

1 Ответ

0 голосов
/ 29 мая 2020

Я думаю, вы в основном пытаетесь заново изобрести WebServer или что-то похожее на него. Мой первый совет - никогда не изобретайте велосипед, если у вас просто стоит полностью заправленная машина с ключами в замке зажигания.

И особенно веб-задачи решались десятки раз.

Но если вам нужно сделать это самостоятельно, обычно вы получите:

  • один publi c порт
  • один поток, который ничего не делает, кроме прослушивания порта, помещая все, что получение в ConcurrentQueue , Channel или аналогичную конструкцию.
  • Гигантский пул потоков. Мы говорим о 50-100 потоках на ядро ​​процессора в среднем ASP. Net сервер.
  • эти потоки затем начнут искать в очереди, если есть что-то делать . Вы хотите назначить каждому клиенту отдельный порт, чтобы соединения оставались неизменными. И, возможно, даже попробуйте, чтобы 1 поток обрабатывал каждый запрос от начала до конца sh (однако на практике для этого нет никакой гарантии; ожидайте, что ответственный поток изменится).

Согласование будет go примерно так:

  • Клиент на порт 80: «Эй, я хочу поговорить»
  • Сервер вычисляет и блокирует случайный неиспользуемый порт: «Хорошо, вы можете поговорите со мной через порт 54321 ".
  • Клиент на порт 54321:" Хорошо, вот что я хочу ... "
...