Websocket代码可在控制台中使用,但不能在Winform中使用

时间:2019-03-04 00:44:11

标签: c# websocket

我尝试用该库进行websocket调用:

使用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 :(得分:1)

我的猜测是,如果调用未在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();
}