private async Task writeDataAsync(List <T> samples, string dim, long index) { // Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 序列化payload"); //var ms = new MemoryStream(); //Serializer.Serialize(ms, samples); //byte[] result = ms.ToArray(); byte[] result = ZeroFormatterSerializer.Serialize(samples); // Debug.WriteLine("size: "+result.Count()); // Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 结束序列化payload"); SEPayload newPayload = new SEPayload(); newPayload.parentid = signalId; newPayload.indexes = index; newPayload.samples = result; newPayload.dimensions = dim; // Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 插入payload"); await mapper.InsertAsync <SEPayload>(newPayload); // Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 结束插入payload"); }
public async Task AppendSampleAsync(List <long> dim, List <T> samples) { // mySignal.IsWritting = true; long index; string dimension = DimensionsToText(dim); if (mySignal.IsWritting == true) { cacheBuffer[dimension].templeSample.AddRange(samples); } mySignal.IsWritting = true; if (lastDimension.Equals(dimension)) { List <T> templeSamples = cacheBuffer[dimension].templeSample; long templeIndex = cacheBuffer[dimension].templeIndex; if (samples.Count + templeSamples.Count >= sampleCount) { //补充完再添加 List <T> data = new List <T>(); templeSamples.AddRange(samples); //把缓存Buffer里的数据写入数据库 while (templeSamples.Count >= sampleCount) { index = templeIndex + 1; //保证每个Payload大小为sampleCount for (int i = 0; i < sampleCount; i++) { data.Add(templeSamples[i]); } templeSamples.RemoveRange(0, (int)sampleCount); await writeDataAsync(data, dimension, index); templeIndex = index; } cacheBuffer[dimension].templeIndex = templeIndex; } else { //把数据保存在缓存里 cacheBuffer[dimension].templeSample.AddRange(samples); } } else { List <T> templeSamples = new List <T>(); long templeIndex = -1; if (cacheBuffer.ContainsKey(dimension)) { templeSamples.AddRange(cacheBuffer[dimension].templeSample); templeIndex = cacheBuffer[dimension].templeIndex; } else { SEPayload lastPayload = (await mapper.FetchAsync <SEPayload>("SELECT * FROM sepayload where parentid=? and dimensions=?", signalId, dimension)).LastOrDefault(); PayloadCache <T> payloadCache = new PayloadCache <T>(); if (lastPayload != null) { templeSamples = ZeroFormatterSerializer.Deserialize <List <T> >(lastPayload.samples); //var om = new MemoryStream(lastPayload.samples); //templeSamples = Serializer.Deserialize<List<T>>(om); templeIndex = lastPayload.indexes - 1; payloadCache.templeIndex = templeIndex; payloadCache.templeSample = templeSamples; } cacheBuffer.Add(dimension, payloadCache); } if (samples.Count + templeSamples.Count >= sampleCount) { List <T> data = new List <T>(); templeSamples.AddRange(samples); while (templeSamples.Count >= sampleCount) { index = templeIndex + 1; for (int i = 0; i < sampleCount; i++) { data.Add(templeSamples[i]); } templeSamples.RemoveRange(0, (int)sampleCount); await writeDataAsync(data, dimension, index); templeIndex = index; } cacheBuffer[dimension].templeSample.Clear(); cacheBuffer[dimension].templeSample.AddRange(templeSamples); cacheBuffer[dimension].templeIndex = templeIndex; lastDimension = dimension; } else { cacheBuffer[dimension].templeSample.AddRange(samples); lastDimension = dimension; } } mySignal.IsWritting = false; }