我有一個程序用於搜索給定的目錄並將所有文件添加到列表視圖。我的問題是,當搜索繁忙時,UI線程卡住了。我嘗試過使用任務,但無法讓它在異步中工作。列表視圖必須在找到每個文件後更新。Winforms遞歸文件掃描塊UI
我對TPL以及如何使用它做了大量的閱讀,但在這種情況下無法使用它。我將它用於處理數據的一種方法,即創建一個任務來處理它。任何人都可以告訴我下面的代碼有什麼問題,以及如何解決它?
這裏是我的代碼:
private void button1_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
WalkDirectory(new DirectoryInfo(drive));
});
}
public void testTaskUpdateLabel(string labelTeks)
{
Task taskUpdateLabel = new Task(() =>
{
label4.Text = labelTeks;
});
taskUpdateLabel.Start(uiScheduler);
}
public void testTaskUpdateLabel(string labelTeks)
{
Task taskUpdateLabel = new Task(() =>
{
label4.Text = labelTeks;
});
taskUpdateLabel.Start(uiScheduler);
}
public bool WalkDirectory(DirectoryInfo directory)
{
if (directory == null)
{
throw new ArgumentNullException("directory");
}
return this.WalkDirectories(directory);
}
private bool WalkDirectories(DirectoryInfo directory)
{
bool continueScan = true;
continueScan = WalkFilesInDirectory(directory);
if (continueScan)
{
DirectoryInfo[] subDirectories = directory.GetDirectories();
foreach (DirectoryInfo subDirectory in subDirectories)
{
try
{
if ((subDirectory.Attributes & FileAttributes.ReparsePoint) != 0)
{
continue;
}
if (!(continueScan = WalkDirectory(subDirectory)))
{
break;
}
}
catch (UnauthorizedAccessException)
{
continue;
}
}
}
if (continueScan)
{
testTaskUpdateLabel(directory.FullName);
}
return continueScan;
}
private bool WalkFilesInDirectory(DirectoryInfo directory)
{
bool continueScan = true;
// Break up the search pattern in separate patterns
string[] searchPatterns = _searchPattern.Split(';');
// Try to find files for each search pattern
foreach (string searchPattern in searchPatterns)
{
if (!continueScan)
{
break;
}
// Scan all files in the current path
foreach (FileInfo file in directory.GetFiles(searchPattern))
{
try
{
testTaskUpdate(file.FullName);
}
catch (UnauthorizedAccessException)
{
continue;
}
}
}
return continueScan;
}
這stil阻止ui線程。 E.G用戶不能在搜索對話框中選擇calsel,直到搜索操作完成。這就是爲什麼我嘗試使用在當前ui上下文上運行的seprid任務 – Hendri
這不可能是真實的,至少是顯示的代碼。整個過程都在單獨的線程上,所以你的UI線程應該是免費的,除非你正在做其他事情並阻止它。 –
好吧。我沒有做任何在我的問題中沒有顯示的代碼。 – Hendri