Использую библиотеку WebSocketSharp (using WebSocketSharp;) для получения данных с сайта через вебсокет. (просто получение данных из интернета). По сути просто клиентское приложение. Как обрабатывать события?
Пытаюсь сделать что-то вроде сообщений между потоками. Опыта нет совсем. Сделал свои события, чтобы вызывать их в другом потоке. А обработчики и код запускать в основном потоке. Но не прокатило)))) С Invoke всё работает, но совсем не нравиться. Есть другие варианты!???
(ws.OnMessage в другом потоке. Там идёт открытие WinSocket, который онлайн всё время, поэтому нужен отдельный поток (так протокол вебсокет работает). Хотя с http тоже вроде также)
Что-то вроде:
ws.OnMessage += (sender1, e1) =>
{
.....
отправляем_свое_событие_в_основной_поток(моё_событие);
};
//А здесь уже обработчик, который исполнится в осн потоке:
моё_событие+= {...}
Моё событие запускается через invoke. Как-то кривостью попахивает как сделать по-другому? Максимально просто. Получать OnMessage в основном потоке?
Вот весь код.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WebSocketSharp;
using System.Threading;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public string sMessage = "5";
public string[] arr1=new string[500];
public int i=0;
//описываю собственное событие для передачи кода в основной поток.
public delegate void SendMessageDelagate(string message);
public event SendMessageDelagate Message;
public Form1()
{
InitializeComponent();
//вешаю обработчик на своё событие
Message += (s2) =>
{
richTextBox1.Text = "Код сработал нормально";
};
}
private void Button1_Click(object sender, EventArgs e)
{
var ws = new WebSocket("wss://stream.example.com:5443/ws/eur@usd@deals");
string s1 = "";
ws.OnMessage += (sender1, e1) =>
{
Action action = () => Message(sMessage);
s1 = e1.Data;
sMessage = "получен очередной пакет";
//через invoke вызываю своё событие в основном потоке.
Invoke(action);
};
ws.Connect();
}
}
}
UPD2 Действительно разные потоки. И Thread.CurrentThread.ManagedThreadId также разные.

On*происходят в том же потоке. Никакой многопоточности нет. У этого класса есть асинхронные методы, но вы их не используете. – Alexander Petrov Aug 02 '19 at 19:38