private void DriveMonitorThread() { while (true) { var invalidDrive = Path.GetPathRoot(Application.StartupPath); var allDrives = DriveInfo.GetDrives().Where(d => d.IsReady && d.DriveType.Equals(DriveType.Removable) && !d.Name.Equals(invalidDrive, StringComparison.InvariantCultureIgnoreCase)); var formatting = ThreadSafeWinControlHelper.GetDriveInfoProgress(flowLayoutPanel1, DriveInfoProgressStatus.Formatting).Select(c => c.Volume); var addDrives = allDrives.Where(d => !formatting.Contains(d.Name)).Except(_drives, DriveInfoComparer); foreach (var drive in addDrives) { _drives.Add(drive); } Thread.Sleep(300); } }
private void DetectDriveDisconnectThread(DriveInfo drive) { var control = ThreadSafeWinControlHelper.GetDriveInfoProgress(flowLayoutPanel1, drive.Name); while (drive.IsReady || control.Status == DriveInfoProgressStatus.Formatting) { if (control == null) { control = ThreadSafeWinControlHelper.GetDriveInfoProgress(flowLayoutPanel1, drive.Name); } // Waiting for disconnect. Thread.Sleep(300); } lock (_drives) { _drives.Remove(drive); } }
private void _drives_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { var oldItems = e.OldItems != null?e.OldItems.Cast <DriveInfo>() : Enumerable.Empty <DriveInfo>(); foreach (var rmvItem in oldItems) { ThreadSafeWinControlHelper.RemoveDriveInfoWrapper(flowLayoutPanel1, rmvItem.Name); } var newItems = e.NewItems != null?e.NewItems.Cast <DriveInfo>() : Enumerable.Empty <DriveInfo>(); foreach (var addItem in newItems) { var t = new Thread((ThreadStart) delegate { DetectDriveDisconnectThread(addItem); }) { Name = string.Format("ThumbDriveDuplicatorDisconnect;{0}", addItem.RootDirectory.FullName), IsBackground = true }; t.Start(); var driveWrapper = new DriveInfoData(addItem); ThreadSafeWinControlHelper.AddDriveInfoWrapper(this, flowLayoutPanel1, driveWrapper); } }
private void SetStatus(DriveInfoProgressStatus status, string formatString = "{0}") { Status = status; ThreadSafeWinControlHelper.SetText(label2, string.Format(formatString, status)); }
private void _driveInfoWrapper_ProgressChanged(object sender, EventArgs e) { Progress = _driveInfoData.Progress; ThreadSafeWinControlHelper.SetProgress(progressBar1, (int)(Progress * 100)); }