我們來玩個新東西把!微軟的Rx(Reactive Extensions)異步編程模型,妳這要求用這玩意做到方便
核心代碼:(沒有文本,所以我這裏模擬讀取數據部分,妳可以自己補齊全文件讀寫部分,其他詳細部分,參考附件項目,)
?var?realSource?=?Observable.FromEvent<MyData>(a?=>?real.OnData?+=?a,?a?=>?real.OnData?-=?a);//?每兩秒生成假數據的可觀察源
var?dummySource?=?Observable.Interval(TimeSpan.FromSeconds(2))
.Select(_?=>?new?MyData?{?IsDummy?=?true,?Timestamp?=?DateTime.Now,?Value?=?0?});
var?n?=?5;
//?合並真假源,取每1s的時間窗口內的數據,如果存在真數據,就把假數據剔除(這樣理論上相鄰數據之間的間隔不會超過3s)
//?緩存每n秒的數據訂閱輸出(壹次寫多條數據到數據庫性能好點)
var?sub?=?realSource.Merge(dummySource).Buffer(TimeSpan.FromSeconds(1)).SelectMany(buf?=>
{
if?(buf.Any(d?=>?!d.IsDummy))
buf?=?buf.Where(d?=>?!d.IsDummy).ToList();
return?buf;
}).Buffer(TimeSpan.FromSeconds(n)).Subscribe(buf?=>
{
//?訂閱數據,輸出(或保存到數據庫)
foreach?(var?d?in?buf)
{
this.textBox1.Invoke(new?Set_Text(setText),d);
}
});
real.Start();?//?啟動真實數據接收