Можно использовать общую очередь для передачи данных.
Где данные поступают, вы помещаете данные в конец очереди:
lock (sharedQueue)
{
sharedQueue.Enqueue(data);
}
В потоке пользовательского интерфейса вы найдете способ прочитать эти данные, например, используя таймер:
var incomingData = new List<DataObject>();
lock (sharedQueue)
{
while (sharedQueue.Count > 0)
incomingData.Add(sharedQueue.Dequeue());
}
// Use the data in the incomingData list to plot.
Идея в том, что вы не сообщаете, что данные поступают. Поскольку у вас постоянный поток данных, я подозреваю, что это не проблема. Я не говорю, что точная реализация, как приведено выше, это остальное, но это общая идея.
Я не уверен, как вам следует проверять наличие новых данных, потому что мне не хватает подробностей о приложении; но это может быть началом для вас.