【发布时间】:2013-08-08 21:46:33
【问题描述】:
我正在编写一个程序来记录称重传感器数据。数据收集在单独的线程中完成。存储数据的集合每 0.5 秒传回一次到 UI 中,并以图表形式显示。我正在使用 foreach 将其复制到 ZedGraph 的点列表中。问题是,在数据收集线程中的新数据更新集合之前,foreach 循环有时不会完成。这会导致抛出异常。
有人对我如何解决这个问题有任何建议吗?
预计到达时间:
private void record()
{
stopwatch.Reset();
stopwatch.Start();
comport.Open();
comport.DiscardInBuffer();
comport.DiscardOutBuffer();
//comport.Write(COMMAND_COLDRESET + Environment.NewLine);
//comport.Write(COMMAND_CONTINUOUSMODE + "<CR>");
comport.Write(COMMAND_CONTINUOUSMODE + Environment.NewLine);
recordingStartTrigger(); //** Fire Recording Started Event
TimeOut.Start();
updateTimer.Start();
this.waitHandleTest.WaitOne(); //** wait for test to end
TimeOut.Stop();
updateTimer.Stop();
comport.sendCommand(COMMAND_COMMANDMODE + Environment.NewLine);
comport.Close();
recordingStopTrigger(status); //** Fire Recording Stopped Event
stopwatch.Stop();
}
//***********************************************************************************
//** Events Handlers
private void comDataReceived_Handler(object sender, SerialDataReceivedEventArgs e)
{
double force = 0;
TimeOut.Stop();
string temp = comport.getBuffer(true);
if (!this.stop)
{
//force = Convert.ToDouble(temp);
if(double.TryParse(temp, out force))
{
report.Readings.Add(new Models.Reading { Time = stopwatch.ElapsedMilliseconds, Force = force });
}
}
else
{
this.WaitEventTest.Set(); //** triggers the record method to continue and end the test.
}
TimeOut.Start(); //** reset TimeOut Timer
}
void updateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//** fire delagate that GUI will be listening to, to update graph.
eventNewData(this, new eventArgsNewData(report));
}
【问题讨论】:
-
你能展示一些示例代码吗?
-
您可以使用诸如持久不可变集合或写时复制等花哨的技巧来更好地做到这一点。你需要什么操作?
-
可以使用可观察的并发集合来完成吗?当集合在另一个线程中更新时,UI 线程能否监听集合的变化?
-
我不知道...我对可观察并发集合一无所知。
标签: c# .net multithreading