Лучший способ реализовать слушателя сокета в C#

glibc обеспечивает след () функция.

http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

7
задан 15 November 2009 в 16:35
поделиться

4 ответа

Вы можете использовать TcpListener , который ожидает входящих соединений в другом потоке. Каждый раз, когда вы получаете новое соединение, создавайте новый поток для его обработки. Используйте Control.Invoke для обновления пользовательского интерфейса из потока без пользовательского интерфейса. Вот краткий пример:

public MainForm()
{
    InitializeComponents();
    StartListener();
}

private TcpListener _listener;
private Thread _listenerThread;

private void StartListener()
{
    _listenerThread = new Thread(RunListener);
    _listenerThread.Start();
}

private void RunListener()
{
    _listener = new TcpListener(IPAddress.Any, 8080);
    _listener.Start();
    while(true)
    {
        TcpClient client = _listener.AcceptTcpClient();
        this.Invoke(
            new Action(
                () =>
                {
                    textBoxLog.Text += string.Format("\nNew connection from {0}", client.Client.RemoteEndPoint);
                }
            ));;
        ThreadPool.QueueUserWorkItem(ProcessClient, client);
    }
}

private void ProcessClient(object state)
{
    TcpClient client = state as TcpClient;
    // Do something with client
    // ...
}
11
ответ дан 6 December 2019 в 15:23
поделиться

Вы можете использовать класс TcpListener . В документации есть пример.

1
ответ дан 6 December 2019 в 15:23
поделиться

При запуске вы можете порождать (создавать) новый поток, который в бесконечном цикле прослушивает новые сообщения. После получения сообщения поток может обновить некоторый общий ресурс (установить флаг). Конечно, вы могли бы сделать это более сложным, если бы использовали синхронизированную очередь для передачи сообщений. Или через WCF (хотя это кажется излишним для ваших целей).

1
ответ дан 6 December 2019 в 15:23
поделиться

Возможно, это не лучший способ сделать это, но он должен работать ...

Вы можете запустить свой код прослушивателя TCP в новом потоке при запуске программы ... Это способ прослушивания TCP-кода, в то время как пользовательский интерфейс отключен от других вещей. Когда что-то происходит в потоке TCP, он должен будет сигнализировать потоку пользовательского интерфейса каким-то событием или очередью событий.

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

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

1
ответ дан 6 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: