void peer_PieceMessageReceived(object sender, PieceMessage e) { //lock ((object)_recievePieceNumber) //{ // _recievePieceNumber++; // Console.WriteLine("_recievePieceNumber:{0}, piece:{1}", _recievePieceNumber, e); //} ShowMessage("{0}:Received {1}", sender, e); _blockManager.Write(e.GetBlock(), e.Index, e.Begin); Peer peer = (Peer)sender; peer.RemoveRequestedBlock(e.Index, e.Begin); //if received piece is corrent, it will request the next piece, //otherwise it will request the crash piece again. if (_blockManager[e.Index].AllDownloaded) { if (_blockManager.CheckPiece(e.Index)) { lock (_peerList) { foreach (Peer p in _peerList) { if (p.IsHandshaked) { p.SendHaveMessageAsync(e.Index); } } } } else { failTimes++; _blockManager.ResetDownloaded(e.Index); _blockManager.ResetRequestedByIndex(e.Index); } } RequestNextBlocks(peer, 1); }