public static ChacheManager Instence() { if (_instance == null) { lock (syncLock) { if (_instance == null) { _instance = new ChacheManager(); IsStopDic = new ConcurrentDictionary <string, bool>(); ReferenceCount = new Dictionary <string, int>(); _lockDic = new Dictionary <string, object>(); } } } return(_instance); }
public byte[] OutItemchache(string taskId) { _customSemphore[taskId].WaitOne(); //手动抛出异常,结束过本次任务 ChacheManager.Instence().ThrowException(taskId, ExceptionEnum.STOPEX.ToString()); byte[] bytes = null; if (_itemTaskChache.ContainsKey(taskId)) { bool result = _itemTaskChache[taskId].TryDequeue(out bytes); } try { _productSemaphore[taskId].Release(); } catch (Exception ex) { Log.WriteLog("Release ProductSemEx:" + ex.Message); } return(bytes); }
public void InputItemTaskChache(string taskId, byte[] tmpbytes, int len, UploadInfo uploadInfo) { //手动抛出异常,结束过本次任务 ChacheManager.Instence().ThrowException(taskId, ExceptionEnum.STOPEX.ToString()); int blockSize = uploadInfo.BlockSize; long fileSize = uploadInfo.FileSize; int NUMBLOCKS = uploadInfo.NumBlocks; int LastBlockSize = uploadInfo.LastBlockSize; //构建块 try { if (!_chache.ContainsKey(taskId)) { byte[] _chacheBytes = new byte[blockSize]; _chache.Add(taskId, _chacheBytes); _offset.Add(taskId, 0); _numBlocks.Add(taskId, 0); } if (_offset.ContainsKey(taskId)) { //剩余的字节 int needSize = blockSize - _offset[taskId]; if (len < needSize) { Array.Copy(tmpbytes, 0, _chache[taskId], _offset[taskId], len); _offset[taskId] += len; } else { int leftSize = len - needSize; //第一块 Array.Copy(tmpbytes, 0, _chache[taskId], _offset[taskId], needSize); internalEnqueue(taskId, _chache[taskId], blockSize); _chache[taskId] = new byte[blockSize]; _offset[taskId] = 0; //剩余的整块数 int countBlock = leftSize / blockSize; int fanilSize = leftSize % blockSize; for (int i = 0; i < countBlock; i++) { //多余的块 byte[] newBlockBytes = new byte[blockSize]; Array.Copy(tmpbytes, needSize + i * blockSize, newBlockBytes, 0, blockSize); internalEnqueue(taskId, newBlockBytes, blockSize); } //最后剩余的块 int newoffset = needSize + countBlock * blockSize; Array.Copy(tmpbytes, newoffset, _chache[taskId], 0, leftSize - countBlock * blockSize); _offset[taskId] = len - newoffset; } //如果是最后一块 if (_numBlocks.ContainsKey(taskId) && _numBlocks[taskId] == NUMBLOCKS - 1) { Log.WriteLog("last block-------------" + "m:" + _offset[taskId] + "n:" + LastBlockSize); if (_offset[taskId] == LastBlockSize) { Log.WriteLog("finished-------------"); byte[] newBytes = new byte[LastBlockSize]; Array.Copy(_chache[taskId], newBytes, LastBlockSize); internalEnqueue(taskId, newBytes, LastBlockSize); _chache.Remove(taskId); _offset.Remove(taskId); _numBlocks.Remove(taskId); Log.WriteLog("download finished ....."); } } } } catch (Exception ex) { Log.WriteLog("build block:" + ex.ToString()); } }