C# 如果我将列表移动到新线程,则无法填充列表
我正在使用C# 如果我将列表移动到新线程,则无法填充列表,c#,C#,我正在使用SafeFileEnumerator类搜索文件夹根目录中的文件,该类仅返回具有权限的位置的文件,因此我成功地使用了它 当我尝试以这种方式填写列表时,一切正常: List<string> list = new List<string>(); list = SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath,
SafeFileEnumerator
类搜索文件夹根目录中的文件,该类仅返回具有权限的位置的文件,因此我成功地使用了它
当我尝试以这种方式填写列表时,一切正常:
List<string> list = new List<string>();
list = SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath,
"*.*", SearchOption.AllDirectories).ToList();
List List=新列表();
list=SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath,
“**”,SearchOption.AllDirectories.ToList();
但在本例中,我的GUI冻结,因此我将其移动到新线程,在本例中,什么也没有发生,我想知道为什么:
private void btnAddDir_Click(object sender, EventArgs e)
{
List<string> list = new List<string>();
string fileToAdd = string.Empty;
List<string> filesList = new List<string>();
dialog = folderBrowserDialog1.ShowDialog();
tbAddDir.Text = folderBrowserDialog1.SelectedPath;
string pathToSearch = folderBrowserDialog1.SelectedPath;
if (dialog == DialogResult.OK)
{
toolStripStatusLabel.Text = "Search for pcap files...";
groupBoxRootDirectory.Enabled = false;
btnStart.Enabled = false;
ThreadStart starter = delegate
{
list = SafeFileEnumerator.EnumerateFiles(pathToSearch, "*.pcap", SearchOption.AllDirectories).ToList();
};
Thread t = new Thread(starter);
t.IsBackground = true;
t.Start();
if(list.Count != 0)
AddFilesToListBox(list);
}
}
private void btnaddir\u单击(对象发送方,事件参数e)
{
列表=新列表();
string fileToAdd=string.Empty;
List filesList=新列表();
dialog=folderBrowserDialog1.ShowDialog();
tbAddDir.Text=folderBrowserDialog1.SelectedPath;
string pathToSearch=folderBrowserDialog1.SelectedPath;
if(dialog==DialogResult.OK)
{
toolStripStatusLabel.Text=“搜索pcap文件…”;
groupBoxRootDirectory.Enabled=false;
btnStart.Enabled=false;
ThreadStart starter=委托
{
list=SafeFileEnumerator.Enumerator文件(路径搜索,*.pcap),搜索选项.AllDirectories.ToList();
};
螺纹t=新螺纹(起动器);
t、 IsBackground=true;
t、 Start();
如果(list.Count!=0)
添加文件列表框(列表);
}
}
SafeFileEnumerator类代码:
public static class SafeFileEnumerator
{
public static IEnumerable<string> EnumerateDirectories(string parentDirectory, string searchPattern, SearchOption searchOpt)
{
try
{
var directories = Enumerable.Empty<string>();
if (searchOpt == SearchOption.AllDirectories)
{
directories = Directory.EnumerateDirectories(parentDirectory).SelectMany(x => EnumerateDirectories(x, searchPattern, searchOpt));
}
return directories.Concat(Directory.EnumerateDirectories(parentDirectory, searchPattern));
}
catch (UnauthorizedAccessException ex)
{
return Enumerable.Empty<string>();
}
}
public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOpt)
{
try
{
var dirFiles = Enumerable.Empty<string>();
if (searchOpt == SearchOption.AllDirectories)
{
dirFiles = Directory.EnumerateDirectories(path).SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt));
}
return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern));
}
catch (UnauthorizedAccessException ex)
{
return Enumerable.Empty<string>();
}
}
}
公共静态类安全文件枚举器
{
公共静态IEnumerable枚举目录(string parentDirectory、string searchPattern、SearchOption searchOpt)
{
尝试
{
var directories=Enumerable.Empty();
if(searchOpt==SearchOption.AllDirectories)
{
目录=目录。枚举目录(parentDirectory)。选择many(x=>EnumerateDirectories(x,searchPattern,searchOpt));
}
return directories.Concat(Directory.EnumerateDirectories(parentDirectory,searchPattern));
}
捕获(未经授权的访问例外)
{
返回可枚举的.Empty();
}
}
公共静态IEnumerable枚举文件(字符串路径、字符串搜索模式、SearchOption searchOpt)
{
尝试
{
var dirFiles=Enumerable.Empty();
if(searchOpt==SearchOption.AllDirectories)
{
dirFiles=Directory.EnumerateDirectories(path).SelectMany(x=>EnumerateFiles(x,searchPattern,searchOpt));
}
返回dirFiles.Concat(Directory.EnumerateFiles(path,searchPattern));
}
捕获(未经授权的访问例外)
{
返回可枚举的.Empty();
}
}
}
在我的列表中满是文件之后:
private void AddFilesToListBox(List<string> filesList)
{
string fileToAdd = string.Empty;
Editcap editcap = new Editcap();
Capinfos capinfos = new Capinfos();
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork +=
(s1, e1) =>
{
foreach (string fileName in filesList)
{
FileInfo fileInfo = new FileInfo(fileName);
if (checkFileCreationDate(fileInfo))
{
if (editcap.isWiresharkFormat(fileInfo.FullName))
{
if (editcap.isLibpcapFormat(fileInfo.FullName))
{
addFileToListBox(fileInfo.FullName, capinfos.getFileDuration(fileInfo.FullName));
}
else if (!editcap.isLibpcapFormat(fileInfo.FullName))
{
fileToAdd = editcap.getNewFileName(fileInfo.FullName);
if (new FileInfo(fileToAdd).Exists && !fileInfo.Exists)
{
addFileToListBox(fileToAdd, capinfos.getFileDuration(fileInfo.FullName));
}
}
}
}
//this.Invoke((MethodInvoker)delegate { lvFiles.Items[lvFiles.Items.Count - 1].Selected = true; });
toolStripStatusLabel.Text = string.Format("{0} files were added", lvFiles.Items.Count);
}
//this.Invoke((MethodInvoker)delegate { lvFiles.Items[lvFiles.Items.Count - 1].Selected = true; });
};
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
(s1, e1) =>
{
groupBoxRootDirectory.Enabled = true;
btnClear.Enabled = true;
if (lvFiles.Items.Count != 0)
btnStart.Enabled = true;
toolStripStatusLabel.Text = string.Format("{0} files were added", lvFiles.Items.Count);
if (tbAddDir.Text != "")
{
listener = new FileListener();
listener.startListener(tbAddDir.Text);
listener._newFileEventHandler += listener_newFileEventHandler;
}
});
backgroundWorker.RunWorkerAsync();
}
private void AddFilesToListBox(列表文件列表)
{
string fileToAdd=string.Empty;
Editcap Editcap=新的Editcap();
Capinfos Capinfos=新的Capinfos();
BackgroundWorker BackgroundWorker=新的BackgroundWorker();
backgroundWorker.WorkerReportsProgress=true;
底层工人+=
(s1,e1)=>
{
foreach(文件列表中的字符串文件名)
{
FileInfo FileInfo=新的FileInfo(文件名);
如果(选中文件创建日期(文件信息))
{
if(editcap.isWiresharkFormat(fileInfo.FullName))
{
if(editcap.isLibpcapFormat(fileInfo.FullName))
{
addFileToListBox(fileInfo.FullName,capinfos.getFileDuration(fileInfo.FullName));
}
如果(!editcap.isLibpcapFormat(fileInfo.FullName))
{
fileToAdd=editcap.getNewFileName(fileInfo.FullName);
if(新文件信息(fileToAdd.Exists&!FileInfo.Exists)
{
addFileToListBox(fileToAdd,capinfos.getFileDuration(fileInfo.FullName));
}
}
}
}
//this.Invoke((MethodInvoker)委托{lvFiles.Items[lvFiles.Items.Count-1].Selected=true;});
toolStripStatusLabel.Text=string.Format(“添加了{0}个文件”,lvFiles.Items.Count);
}
//this.Invoke((MethodInvoker)委托{lvFiles.Items[lvFiles.Items.Count-1].Selected=true;});
};
backgroundWorker.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(
(s1,e1)=>
{
groupBoxRootDirectory.Enabled=true;
btnClear.Enabled=true;
如果(lvFiles.Items.Count!=0)
btnStart.Enabled=true;
toolStripStatusLabel.Text=string.Format(“添加了{0}个文件”,lvFiles.Items.Count);
如果(tbAddDir.Text!=“”)
{
listener=newfilelistener();
listener.startListener(tbAddDir.Text);
侦听器。\u newFileEventHandler+=侦听器\u newFileEventHandler;
}
});
backgroundWorker.RunWorkerAsync();
}
在t.start()之后,我调用AddFilesToListBox(list)
您没有实现一个
在
t.Start()之后调用code>时,线程尚未完成其工作,因此在调用AddFilesToListBox
时,列表仍然为空。执行一个异步模式,并在线程完成其任务后调用AddFilesToListBox
。你能比“什么都没发生”更具体吗?当您跟踪代码时,是否在文件存在时未找到任何文件?它是否查找文件但不在UI中显示?它是否引发异常?虽然代码进入SafeFileEnumerator.EnumerateFiles方法,但未找到任何文件。您何时从返回的列表中读取值?你在等另一个吗