План: получить много данных из последовательного порта и отобразить их на экране.
Проблема: SerialPort.dataReceived работает в другом потоке, чем поток пользовательского интерфейса, и поток пользовательского интерфейса, похоже, также владеет источником данных. Это означает, что я не могу просто добавить в список прямо в потоке последовательного порта. Мое решение этой проблемы заключалось в создании статического класса, который действует как моя «База данных», и мой поток последовательного порта передает свои данные этому классу. Затем в своем потоке пользовательского интерфейса я получаю эти данные и копирую их в список потоков пользовательского интерфейса, и это работает, но это отстой.
Это большая проблема:
LocalRawDataCollection.Clear();
for( int i = 0; i < Database.GetRawDataCollection().Count; i++)
{
LocalRawDataCollection.Add(Database.GetRawDataItem(i));
}
RawDataGrid.Items.Refresh();
Насколько я знаю, я делаю это 3 раза, каждый раз, когда я хочу обновить свою сетку данных, программа становится очень медленной. В идеале я бы просто сделал:
LocalRawDataCollection = Database.getRawDataCollection();
Но когда я это сделал, данные не отобразились на моем экране.
Одним из решений было бы разделить сетки и остальную часть пользовательского интерфейса, чтобы у меня было 2 потока пользовательского интерфейса. Это не помогло бы моей сетке данных, но, по крайней мере, я мог бы хорошо использовать остальную часть своего окна. Я не понимаю, как мне это сделать, и я не мог найти для этого никаких хороших документов.
Могу ли я сделать это лучше?
@Clemens Спасибо! это было именно то, что я искал.
Вы можете взглянуть на BindingOperations.EnableCollectionSynchronization.