public static SharedBuffer CreateBuffer(Guid id, Type elementType, long bufferSize)
        {
            var sb = new SharedBuffer();
            sb.Id = id;
            sb.ElementTypeString = elementType.FullName;
            sb.ElementSize = Marshal.SizeOf(elementType);
            sb.ElementCount = bufferSize;

            if (_blockPath != string.Empty)
            {
                var fileStream = System.IO.File.Create(string.Format(@"{0}\{1}", _blockPath, id.ToString()), 
                    (int)(bufferSize * sb.ElementSize), System.IO.FileOptions.DeleteOnClose);

                var mmf = MemoryMappedFile.CreateFromFile(fileStream, id.ToString(), 
                    (int)(bufferSize * sb.ElementSize),
                    MemoryMappedFileAccess.ReadWrite, null, System.IO.HandleInheritability.None, false);

                _cacheBuffers.TryAdd(id, sb);
                _cacheMmfs.TryAdd(id, mmf);
                _cacheFileStreams.TryAdd(id, fileStream);
            }
            else
            { 
                var mmf = MemoryMappedFile.CreateNew(id.ToString(), 
                    bufferSize * sb.ElementSize);
                _cacheBuffers.TryAdd(id, sb);
                _cacheMmfs.TryAdd(id, mmf);
            }

            return sb;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sb"></param>
        public void PrefetchBuffer(SharedBuffer sb)
        {
            if ((!_sbStack.Any(sbOther => sbOther.Id.CompareTo(sb.Id) == 0))
                && (!_sbDone.Any(sbOther => sbOther.Id.CompareTo(sb.Id) == 0)))
                _sbStack.Push(sb);

            if (_sbPrefetchTask == null
                || _sbPrefetchTask.Status != System.Threading.Tasks.TaskStatus.Running)
            {
                Action prefetchAction = () =>
                    {
                        try
                        {
                            while (true)
                            {
                                SharedBuffer sbLocal;
                                if (_sbStack.TryPop(out sbLocal))
                                {
//#if SLOW_POKE
//                                var handle = sbLocal.GetHandle();
//                                const long STEP_SIZE = 4096;
//                                long numSteps = (long)handle.ByteLength / STEP_SIZE;
//                                System.Threading.Tasks.Parallel.For(0, numSteps,
//                                    at => handle.Read<byte>((ulong)(at * STEP_SIZE)));
//                                sbLocal.ReleaseHandle();
//#else
//                                    BufferRepository.ReadFile(sbLocal.Id);
//#endif
                                    _sbDone.Add(sbLocal);
                                }
                            }
                        }
                        finally
                        { 
                            System.Console.WriteLine("Exiting prefetch...");
                        }
                    };

                _sbPrefetchTask = new System.Threading.Tasks.Task(prefetchAction);
                _sbPrefetchTask.Start();
            }
        }