Вебсокеты (WebSockets) и многопоточность

Нужен клиент для вебсокетов. Нашел вот это:

А как заставить клиент работать в дополнительном потоке (или таске)? :thinking: Чтобы соединение не закрывалось. В примерах, которые находил, везде Console.ReadLine() используют.
Там ещё сервер, к которому хочу подключиться, требует пинговать его каждые 10-30 секунд. Как это сделать в потоке? :thinking: Там же таймера нет.

Так это просто пример, чтоб легко запустить и увидеть.
А так можно запускать где угодно, что-то делать с ними в цикле и т.д.

Например, Sleep или Task.Delay?

Вот я и не пойму, как это сделать. Там же нет цикла ожидания сообщений, как у обычных сокетов. Просто .Connect() и всё. Код идёт дальше и метод завершается, как я понял.
Или так и должно быть? :thinking: Просто переменная сокета нужна глобальная. Я не пробовал.

Но это зафризит весь поток и сообщения от сервера перестанут обрабатываться. И что фризить, если цикла же нет?

https://github.com/sta/websocket-sharp/blob/master/Example/Program.cs

Там есть OnMessage, может оно и так в другом потоке.

Для пинга там возможно тоже есть какой-то отдельный механизм.

Проверил. Сообщения идут, окно таскается. Видимо, оно само синхронизируется. Хотя странно как-то :thinking: Или может это из-за того что я сообщения в дебаг-консоль вывожу. А если выводить в гуй, то всё крашнется :man_shrugging:
Только не понятно. Если сделать ws.Send() в основном потоке, он может повиснуть, если будут какие-то глюки со связью :thinking:

Да, точно. Я так и думал. Сообщения идут в другом потоке. Без Invoke() не работает.