求给个思路或许具体方法。

求给个思路或者具体方法。。
现在有这样一个要求。

持续往数据库里写入一些信息,每2S写入一次。写入的数据是默认值。------动作1


当程序接收到数据时,动作1停止,把接收到数据写入数据库。-------------动作2


动作2写入完成后,把动作2中接收到的数据传给动作1,动作1继续执行。但写入的数据是传来的新数据。




还有个比较坑的问题,接收的数据可能1S中之内接收到多条,而且不相同。。。。
------解决思路----------------------
你就按3楼所说的,取数据和写数据分开处理就行了
取到数据,不管是取的快还是慢,先写到一个全局变量里去
然后再写数据库
另开个线程或timer,每两秒把全局变量写入数据库
------解决思路----------------------
首先应该考虑的是不要把假数据写到数据库,如果非写不可,那可以使用Rx,它非常适合做这种多个异步数据源处理的事情。
做了个例子,这里贴下主要代码,完整代码放在https://code.****.net/snippets/516016,需要引用Rx-Main

// 通过事件来创建真数据的可观察源
var real = new RealDataProducer();
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)
    {
        Console.WriteLine("{0} {1} {2}", d.Timestamp.ToString("mm:ss.fff"), d.IsDummy ? "D" : "R", d.Value);
    }
});
real.Start(); // 启动真实数据接收

这样,不用自己处理定时器、线程、时间窗、缓存...还是Linq的方式,没有比Rx更方便的了。