Ich möchte ein Ordner-Cleaner-Programm erstellen. Es wird erwartet, dass gelöschte Dateien in Echtzeit an eine TextBox
Steuerung gemeldet werden. So verwende ich await Task.Run(() => CleanFolder(folderPath, progress))
Funktion in meinem Button Click Event. Aber die Benutzeroberfläche wurde beim Ausführen blockiert. Nach einer Weile, wenn die Methode CheanFolder()
ausgeführt wird, werden alle gelöschten Dateien gleichzeitig angezeigt.UI bei Verwendung blockiert warten auf eine zeitraubende Aufgabe
namespace FolderCleaner
{
public partial class MainWindow : Window
{
string folderPath;
string matchPattern;
private void ButtonOpen_Click(object sender, RoutedEventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog() { Description = "Select a folder" };
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
folderPath = fbd.SelectedPath;
textBoxPath.Text = folderPath;
buttonClean.IsEnabled = true;
textBoxList.Text = "Folder path: " + folderPath + "\n";
}
}
private async void ButtonClean_Click(object sender, RoutedEventArgs e)
{
matchPattern = textBoxPattern.Text;
buttonOpen.IsEnabled = false;
buttonClean.IsEnabled = false;
Progress<string> progress = new Progress<string>(msg =>
{
textBoxList.AppendText("File deleted: " + msg + "\n");
textBoxList.CaretIndex = textBoxList.Text.Length;
textBoxList.ScrollToEnd();
});
try
{
await Task.Run(() => CleanFolder(folderPath, progress));
textBoxList.AppendText("Mission complete!");
textBoxList.CaretIndex = textBoxList.Text.Length;
textBoxList.ScrollToEnd();
}
catch
{
System.Windows.MessageBox.Show("Error!");
}
finally
{
buttonOpen.IsEnabled = true;
}
}
private void CleanFolder(string path, IProgress<string> progress)
{
var filePaths = Directory.EnumerateFiles(path, "*.*", System.IO.SearchOption.AllDirectories);
foreach (var filePath in filePaths)
{
var matchResult = Regex.Match(filePath, matchPattern);
if (matchResult.Success)
{
File.Delete(filePath);
progress.Report(filePath);
}
}
}
}
}
Das Anzeigen des gesamten MainWindow-Codes ist hier nicht erforderlich. Sie können die irrelevanten Codeteile wie den Konstruktor oder den ButtonOpen_Click-Handler entfernen, um Ihre Frage leichter verständlich zu machen. – Clemens
Ich denke, Sie sollten .Invoke() verwenden, um Ihre TextBox zu aktualisieren – McNets