private static void Read(DiskIOReadState state) { try { lock (state.Buffer) { if (!state.Stream.CanRead) { throw new TorrentException("Stream unreadable."); } state.Stream.Seek(state.StreamOffset, SeekOrigin.Begin); int read = state.Stream.Read(state.Buffer, state.BufferOffset, (int)state.Length); if (read != state.Length) { state.Callback(false, read, null, state.State); } else { state.Callback(true, read, state.Buffer, state.State); } ReadCache.Put(state); } } catch (Exception) { state.Callback(false, 0, null, state.State); ReadCache.Put(state); } }
public static void QueueRead(Stream stream, byte[] buffer, int bufferOffset, long streamOffset, long length, DiskIOReadCallback callback, object state) { while (ReadQueue.Count > MaxPendingOps) { Thread.Sleep(10); } DiskIOReadState readData = ReadCache.Get().Init(stream, buffer, bufferOffset, streamOffset, length, callback, state); ReadQueue.Enqueue(readData); if (ReadQueue.Count > MinPendingOps) { IOHandle.Set(); } }
private static void Read(DiskIOReadState state) { try { lock (state.Buffer) { if (!state.Stream.CanRead) throw new TorrentException("Stream unreadable."); state.Stream.Seek(state.StreamOffset, SeekOrigin.Begin); int read = state.Stream.Read(state.Buffer, state.BufferOffset, (int)state.Length); if(read != state.Length) state.Callback(false, read, null, state.State); else state.Callback(true, read, state.Buffer, state.State); ReadCache.Put(state); } } catch (Exception) { state.Callback(false, 0, null, state.State); ReadCache.Put(state); } }