private void OnTimerElapsed(object state) { #if DEBUG Console.WriteLine(DateTime.Now.ToString(timeformat) + " | Core.Transfer.ItemsTransferManager.OnTimerElapsed(): Timer elapsed."); #endif ThreadsItemLoadWork.CleanNotWorkingThread(); if (ItemsTransferWork.Count < ItemsWorkingLimit) { for (int i = 0; i < ItemsTransfer.ItemsBlinding.Count; i++) { if (ItemsTransfer.ItemsBlinding[i].status == StatusTransfer.Waiting) { Thread thr = new Thread(WorkThread); ItemsTransfer.ItemsBlinding[i].status = StatusTransfer.Running; thr.Start(ItemsTransfer.ItemsBlinding[i]); ThreadsItemLoadWork.Add(thr); } } } }
public void ManagerItemsAndRefreshData() { //clean thread ThreadsItemLoadWork.CleanNotWorkingThread(); switch (GroupData.status) { case StatusTransfer.Loading: return; case StatusTransfer.Started: GroupData.status = StatusTransfer.Running; GroupData.TimeStamp = CurrentMillis.Millis; break; case StatusTransfer.Remove: return; } if (GroupData.status != StatusTransfer.Running) { if (!string.IsNullOrEmpty(GroupData.DataSource.Speed)) { GroupData.DataSource.Speed = ""; } if (!string.IsNullOrEmpty(GroupData.DataSource.Estimated)) { GroupData.DataSource.Estimated = ""; } } #region Count & Remove int count_item_running = 0; int count_item_done = 0; int count_item_error = 0; int count_item_stop = 0; int count_item_remove = 0; for (int i = 0; i < GroupData.items.Count; i++) { if (GroupData.items[i].status == StatusTransfer.Remove) { GroupData.items.RemoveAt(i); i--; count_item_remove++; continue; } else { switch (GroupData.items[i].status) { case StatusTransfer.Running: count_item_running++; break; case StatusTransfer.Moved: case StatusTransfer.Added: case StatusTransfer.Done: count_item_done++; break; case StatusTransfer.Error: count_item_error++; break; case StatusTransfer.Stop: count_item_stop++; break; default: break; } } //clear speed download when not running if (GroupData.items[i].status != StatusTransfer.Running) { if (!string.IsNullOrEmpty(GroupData.items[i].DataSource.Speed)) { GroupData.items[i].DataSource.Speed = ""; } if (!string.IsNullOrEmpty(GroupData.items[i].DataSource.Estimated)) { GroupData.items[i].DataSource.Estimated = ""; } } } #endregion #region Running group if (this.GroupData.status == StatusTransfer.Running) { if (this.GroupData.items.Count != 0 && count_item_done + count_item_error + count_item_stop != this.GroupData.items.Count) { long Group_TotalTransfer = 0; for (int i = 0; i < GroupData.items.Count; i++)//start item waiting and Started(force) { Group_TotalTransfer += GroupData.items[i].SizeWasTransfer; #region start item force start if (this.GroupData.items[i].status == StatusTransfer.Started && this.GroupData.status == StatusTransfer.Running) { Thread thr = new Thread(WorkThread); this.GroupData.items[i].status = StatusTransfer.Running; thr.Start(i); ThreadsItemLoadWork.Add(thr); count_item_running++; } #endregion #region start item waiting if (GroupData.items[i].status == StatusTransfer.Waiting && count_item_running < GroupData.MaxItemsDownload) { Thread thr = new Thread(WorkThread); GroupData.items[i].status = StatusTransfer.Running; GroupData.items[i].TimeStamp = Stopwatch.GetTimestamp(); thr.Start(i); ThreadsItemLoadWork.Add(thr); count_item_running++; } #endregion //caculate speed & time left item if (this.GroupData.items[i].status == StatusTransfer.Running) { GroupData.items[i].CalSpeedAndTimeLeft(); } } //caculate speed & time left group GroupData.CalSpeedAndTimeLeft(Group_TotalTransfer); } else { if (count_item_done == this.GroupData.items.Count) { this.GroupData.status = StatusTransfer.Done;//Done group if (this.AreCut) { //DeleteItems list = new DeleteItems(); //list.PernamentDelete = false; //foreach (AddNewTransferItem item in items) list.items.Add(fromfolder.Path_Raw + (fromfolder.PathIsCloud ? "/" : "\\") + item.name); //Thread thr = new Thread(AppSetting.ManageCloud.Delete); //thr.Start(list); throw new Exception("Transfer done, but not support delete items after copy now."); } } else { this.GroupData.status = StatusTransfer.Error; } } } #endregion #region Change LV if (this.GroupData.change == ChangeTLV.Processing && (this.GroupData.status == StatusTransfer.Done || this.GroupData.status == StatusTransfer.Error || this.GroupData.status == StatusTransfer.Stop)) { this.GroupData.change = ChangeTLV.ProcessingToDone; } if (this.GroupData.change == ChangeTLV.Done && (this.GroupData.status == StatusTransfer.Started || this.GroupData.status == StatusTransfer.Running || this.GroupData.status == StatusTransfer.Waiting || this.GroupData.status == StatusTransfer.Loading)) { this.GroupData.change = ChangeTLV.DoneToProcessing; } #endregion RefreshGroupDataToShow(count_item_done, count_item_remove); }