Я не знаю, если это хороший способ работать со стеком для этой задачи, но я уверен, что существует более быстрый способ ... Я получаю данные от своего микроконтроллера, но длина данных не всегда одинаковой длины. Я подумал, что, может быть, я могу нажимать данные в своем стеке, и в потоке я могу поместить его и декодировать сообщение. Я не хотел замедлять DataReceivedHandler, поэтому я создал Thread, который может вытолкнуть данные и записать их в мой Listview в моей функции decodeMessage().Последовательный порт чтения + Нитки или что-то еще лучше?
Через некоторое время я получаю исключение System.OutOfMemories ..
Любые идеи, как я могу сделать это в лучшую сторону?
Я читаю от моего последовательного порта только тогда, когда данные поступают сюда:
Stack<byte[]> stack = new Stack<byte[]>();
.....
public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
byte[] data = new byte[sp.BytesToRead];
sp.Read(data, 0, data.Length);
stack.Push(data);
}
И это моя тема:
private void formatData()
{
try
{
while (true)
{
byte[] data;
int i=0;
Dispatcher.BeginInvoke(new Action(() =>
{
while (stack.Count > 0)
{
data = stack.Pop();
while (i < data.Length)
{
decodeMessage(data[i]);
i++;
}
}
}));
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
thx
Кажется, вам нужно [BlockingCollection] (http://msdn.microsoft.com/en-us/library/dd267312.aspx) вместо 'Stack' – I4V
Я не думаю, что стек, что вы want, Queue, вероятно, более подходит для этого, так как это FIFO. BlockingCollection, как было предложено выше, использует очередь по умолчанию и является потокобезопасной. Реализация стека не является потокобезопасной, что может вызвать проблемы. –
Но как я знаю, сколько Элементов я должен прочитать через Очередь? – user2261524