2

Есть подключение к серверу по Websocket

var ws = new WebSocket("ws://localhost/client_websocket")
{ 
    ws.OnOpen += (sender, e) => this.Connected();
    ws.OnMessage += (sender, e) => Console.WriteLine(e.Data);
    ws.OnError += (sender, e) =>//делаем что-то при ошибке
    ws.OnClose += (sender, e) => //делаем что-то при отключении
    ws.Connect();
    while (true)
    {
    }
}

Я его запускаю и т.к. метод крутится в while , то дальше ничего не идёт в потоке.
Мне нужно запустить функцию подключения в новом потоке. Что-то не пойму, как работать с Thread и Async-awayt. Подскажите, как такое реализовать?

Gardes
  • 3,358
Rakzin Roman
  • 5,720
  • А чего вы хотите добиться? Зачем вам вызывать функцию подключения в новом потоке? – andreycha Oct 17 '16 at 20:22
  • @andreycha Я запускаю подключение, а потом выполняю другие операции. В данном случает поток висит на подключении. До других операций дело не доходит. Например я хочу, что б пользователь ввёл параметры и они отослались в поток Connection – Rakzin Roman Oct 17 '16 at 20:25
  • 1
    А зачем вам while (true)? – andreycha Oct 17 '16 at 20:27
  • @andreycha Ах- да. работает. Спасибо. Ну а вообще тогда другой вопрос- как быть, если в потоке бесконечная функция- например- каждую секунду- таймер? – Rakzin Roman Oct 17 '16 at 20:37
  • Не понял, поясните. – andreycha Oct 17 '16 at 20:46
  • @andreycha while убрал.всё гуд. Я просто про то, что б запускать несколько функций в потоках и каждая выводила каждую секунду,скажем, время- либо писала, одна - X, другая-Y. Я где-то видел примеры и не могу найти. И тогда в чём разница между Threads и Async awayt. Как я понял Async на самом деле не асинхронный- он просто прерывает поток как-то...вообщем немного запутался в асинхронности(( – Rakzin Roman Oct 17 '16 at 20:54
  • 2
    Используйте для этого таймер. Вот тут немного было про повторяющиеся задачи. Про отличия async/await тут. – andreycha Oct 17 '16 at 21:00
  • 3

2 Answers2

1
  1. Если вы хотите запустить цикл в новом потоке:

    new Thread(() =>
    {
        while (true)
        {
            //TODO
        }
    });
    
  2. Если вы хотите запустить цикл асинхронно используя пул потоков:

    Task.Run(() =>
    {
        while (true)
        {
            //TODO
        }
    });
    
Gardes
  • 3,358
0

Я бы порекомендовал обернуть Ваш код в метод и вызвать его так:

Task.Factory.StartNew(() => MyMethod());

Так же есть перегруженные версии с передачей CancellationToken. В даном примере await async не нужны

MirrorBoy
  • 111
  • От числа одновременно подключенных клиентов зависит. Более 100 клиентов => решения на потоках умирают. – Pavel Mayorov Nov 17 '16 at 07:39
  • Ваш вариант решения? – MirrorBoy Nov 17 '16 at 07:41
  • Зависит от того что внутри цикла. – Pavel Mayorov Nov 17 '16 at 07:42
  • Ну а минусовать то решение зачем. Если все равно не знаем, что будет внутри цикла?.... – MirrorBoy Nov 17 '16 at 07:44
  • 1
    Потому что я придерживаюсь точки зрения что не следует поощрять ответы на плохие вопросы. Не переживайте, на этом сайте полно ботов-плюсовальщиков. – Pavel Mayorov Nov 17 '16 at 08:11
  • Я как-то себе представлял, что – MirrorBoy Nov 17 '16 at 10:48
  • Я как-то себе представлял, что минусовать плохие ответы. А на плохие вопросы просто давать объяснение – MirrorBoy Nov 17 '16 at 10:49
  • Обсуждения организации сайта ведутся на Мете, а не в комментариях к случайному ответу. – Pavel Mayorov Nov 17 '16 at 10:50