我想运行一个方法,从指定的文件夹获取文件列表并在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