Код Websocket работает в консоли, но не в Winform - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь выполнить веб-сокет-вызов с библиотекой:

с использованием WebSocketSharp;

Код работает в консоли, как показано ниже:

public static void Main(string[] args)
{                
    using (var ws = new WebSocket("wss://stream.binance.com:9443/ws/bnbbtc@ticker"))
    {
        ws.OnMessage += (sender, e) =>
            Console.WriteLine("Message received" + e.Data);

        ws.OnError += (sender, e) =>
            Console.WriteLine("Error: " + e.Message);

        ws.Connect();
        Console.ReadKey(true);
    }
}

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

private void button1_Click(object sender, EventArgs e)
{
    new Thread(test).Start();
}

void test()
{
    using (var ws = new WebSocket("wss://stream.binance.com:9443/ws/bnbbtc@ticker"))
    {
        ws.OnMessage += (sender, e) =>
         Invoke((System.Windows.Forms.MethodInvoker)delegate { richTextBox1.Text = "Message: " + e.Data; });

        ws.OnError += (sender, e) =>
            Invoke((System.Windows.Forms.MethodInvoker)delegate { richTextBox1.Text = "Error: " + e.Message; });

        ws.Connect();
    }
}

1 Ответ

0 голосов
/ 04 марта 2019

Я предполагаю, что если вызов не блокируется на ws.Connect(), возможно, ваш поток завершается, а объект сокета удаляется.

В вашем примере с консолью у вас есть Console.ReadKey(true);, который блокирует основной поток

Вы можете попробовать ждать на ManualResetEvent

private ManualResetEvent manualReset = new ManualResetEvent(false);

void test()
{
    using (var ws = new WebSocket("wss://stream.binance.com:9443/ws/bnbbtc@ticker"))
    {
        ws.OnMessage += (sender, e) =>
         Invoke((System.Windows.Forms.MethodInvoker)delegate { richTextBox1.Text = "Message: " + e.Data; });

        ws.OnError += (sender, e) =>
            Invoke((System.Windows.Forms.MethodInvoker)delegate { richTextBox1.Text = "Error: " + e.Message; });

        ws.Connect();

        manualReset.WaitOne();
    }
}

void signalExit()
{
    manualReset.Set();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...