public PerformanceSnapshot Snapshot() { var snap = new PerformanceSnapshot(this.ReadBytes, this.WrittenBytes) { Start = this.Start, Taken = DateTime.UtcNow }; return(snap); }
public IEnumerable <Block> GetBlocks(IEnumerable <uint256> neededBlocks, CancellationToken cancellationToken = default(CancellationToken)) { AssertState(NodeState.HandShaked, cancellationToken); using (TraceCorrelation.Open()) { NodeServerTrace.Information("Downloading blocks"); int simultaneous = 70; PerformanceSnapshot lastSpeed = null; using (var listener = CreateListener() .OfType <BlockPayload>()) { foreach (var invs in neededBlocks .Select(b => new InventoryVector() { Type = InventoryType.MSG_BLOCK, Hash = b }) .Partition(simultaneous)) { NodeServerTrace.Information("Speed " + lastSpeed); var begin = Counter.Snapshot(); var invsByHash = invs.ToDictionary(k => k.Hash); this.SendMessage(new GetDataPayload(invs.ToArray())); Block[] downloadedBlocks = new Block[invs.Count]; while (invsByHash.Count != 0) { var block = listener.ReceivePayload <BlockPayload>(cancellationToken).Object; var thisHash = block.GetHash(); if (invsByHash.ContainsKey(thisHash)) { downloadedBlocks[invs.IndexOf(invsByHash[thisHash])] = block; invsByHash.Remove(thisHash); } } var end = Counter.Snapshot(); lastSpeed = end - begin; foreach (var downloadedBlock in downloadedBlocks) { yield return(downloadedBlock); } } } } }