我想運行一個方法,從指定的文件夾獲取文件列表並在DataGridView中表示它。該方法在BackgroundWorker中運行,因此我期望GUI保持活動狀態。但它仍然凍結。以下是一個示例:BackgroundWorker上的方法凍結GUI
private void startScan_Click(object sender, EventArgs e)
{
bckgrFileScanner.RunWorkerAsync();
}
private void bckgrFileScanner_DoWork(object sender, DoWorkEventArgs e)
{
//for each folder in list perform this function, which scans folder and gets all files
for (int i = 0; i < folderList.Items.Count; i++)
{
GetFileList(ref scannedFiles, folderList.Items[i].ToString(), bckgrFileScanner);
}
}
public static void GetFileList(ref List<FileInfo> fList, string fPath, BackgroundWorker scanner)
{
DirectoryInfo di = new DirectoryInfo(fPath);
FileInfo[] fi = di.GetFiles();
foreach (FileInfo fiTemp in fi)
{
if (fiTemp.Name.StartsWith("~$") == false)
{
//adds items to list of all scanned files
fList.Add(fiTemp);
//reports file name to ProgressChanged method
scanner.ReportProgress(0, fiTemp);
}
}
DirectoryInfo[] dFolders = di.GetDirectories();
//use recursion for all subfolders
foreach (DirectoryInfo d in dFolders)
{
GetFileList(ref fList, d.FullName, scanner);
}
}
private void bckgrFileScanner_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//userstate is filename, so add it to table
filesDataGrid.Rows.Add(e.UserState.ToString());
}
在方法GetFileList「掃描儀」是引用bckgrFileScanner,這就是爲什麼我打電話掃描儀insck bckgrFileScanner。此外,在這種方法中,我甚至無法訪問bckgrFileScanner。 – andree 2011-04-01 07:16:11
啊,是的,我錯過了由於橫向滾動。您可以使用Debug.WriteLine(Thread.CurrentThread ...)來跟蹤哪個線程正在執行代碼,以便您可以檢查您的UI線程是否真的被鎖定或其他事情是否被破壞。 – 2011-04-01 07:21:39
我又增加了一個建議。 – 2011-04-01 07:23:55