예제 #1
0
 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);
     }
 }
예제 #2
0
        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();
            }
        }
예제 #3
0
 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);
     }
 }