private bool doReconn(NetworkStream stream, ulong writeCount, ulong readCount) { Thread thread = null; bool rereadSucceed = false; if (writeCount != _ReadCount) { thread = new Thread(() => { int n = (int)writeCount - (int)_ReadCount; rereadSucceed = _Rereader.Reread(stream, n); }); thread.Start(); } if (_WriterCount != readCount) { if (!_Rewriter.Rewrite(stream, _WriterCount, readCount)) { return(false); } } if (thread != null) { thread.Join(); if (!rereadSucceed) { return(false); } } setBaseStream(stream); return(true); }
public void RereaderTest() { var n = 10000; var q = new Queue <byte[]>(n); var r = new Rereader(); for (int i = 0; i < n; i++) { var b = RandBytes(100); using (var ms = new MemoryStream(b)) { r.Reread(ms, b.Length); } q.Enqueue(b); } for (var i = 0; i < n; i++) { var raw = q.Dequeue(); var b = new byte[raw.Length]; var offset = 0; var remind = raw.Length; while (remind > 0) { var size = rand.Next(remind + 1); if (size == 0) { continue; } r.Pull(b, offset, size); offset = offset + size; remind = remind - size; } Assert.True(BytesEquals(raw, b)); } }