Для петли розеток с нитками - PullRequest
0 голосов
/ 27 декабря 2018

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

цикл foreach:

foreach (var account in accounts)
{
    Connect(account, server);
}

Дело в том, представьте, что у меня есть 200 учетных записей, и Connect ()для запуска требуется 2 секунды, для завершения цикла foreach потребуется более 6 минут.

Пример функции подключения:

private void Connect(User user, Server server)
{
    connection = new Connection($"{server.Ip}:{server.Port.ToString()}", user);
    connection.Connect(); // await
    connection.WaitToConnect(); // await
    connection.SendData(); // await 
    connection.SendAnotherData(); // await
    connection.WaitCallBack(); // await
    if(connection.everythingFine) // From here connection is "completed" but can't be closed
    {
    }

    // Trigger my event handler on disconnect
    connection.Disconnected += disconnectionHandler; 
}

Поскольку Connect () синхронизируется и создает постоянное соединениес обработчиками событий и т. д. Я боюсь использовать потоки и то, что это может вызвать к моему соединению сокета и обработчикам событий.

Редактировать:

Вопрос : как можноЯ реализую многопоточность в цикле foreach в этой ситуации?

1 Ответ

0 голосов
/ 27 декабря 2018

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

foreach (var account in accounts)
{
    var t = new Thread((aObj) => Connect ((Account)aObj, server));
    t.Start(account);
}
...