C# OnMessage получение ответа

Проблема с отображение ответа.

var ws = new WebSocket();
ws.Connect();
ws.Send("getonline");
ws.OnMessage += (sender, e) =>
{
    list.Add(e.Data);
    Onlinelbl.Content = list[0].ToString();
};

Если писать MessageBox.Show(list[0].ToString()); то всё хорошо, а если пытаться присвоить текст lbl, то не получается.

Ничего не происходит, Label не меняет текст.


Ответы (1 шт):

Автор решения: aepot

Во-первых, список List<T> не является потокобезопасным.

Во-вторых вы не можете работать с контролами из стороннего потока.

Решить можно как-то так:

IProgress<string> progress = new Progress<string>(s => 
{
    list.Add(s);
    Onlinelbl.Content = s;
});

var ws = new WebSocket();
ws.Connect();
ws.Send("getonline");
ws.OnMessage += (sender, e) =>
{
    progress.Report(e.Data);
};

Progress выполняет свой делегат всегда в том контексте синхронизации, в котором был создан.

При создании вопросов всегда указывайте, что за сторонние библиотеки вы используете. Мой телепатический навык подсказал, что это WebSocketSharp, но не всегда телепатия хорошо работает.

→ Ссылка