C# 记录大目录中的所有文件

C# 记录大目录中的所有文件,c#,.net,multithreading,directoryinfo,C#,.net,Multithreading,Directoryinfo,我有许多目录,其中包含大量文件(~10000)。我想在我的应用程序中创建这些文件的列表,并且已经将io访问线程化,这样应用程序在加载时不会冻结。但是,如果在加载所有文件之前退出应用程序,则在完成对dirInfo.GetFiles(…)的调用之前,线程不会响应.Join() // ... mythread DirectoryInfo dirInfo = new DirectoryInfo(path); foreach(FileINfo file in dirInfo.GetFile

我有许多目录,其中包含大量文件(~10000)。我想在我的应用程序中创建这些文件的列表,并且已经将io访问线程化,这样应用程序在加载时不会冻结。但是,如果在加载所有文件之前退出应用程序,则在完成对dirInfo.GetFiles(…)的调用之前,线程不会响应.Join()

// ... mythread
    DirectoryInfo dirInfo = new DirectoryInfo(path);
    foreach(FileINfo file in dirInfo.GetFiles(extension)) 
    {
        // with large directories, the GetFiles call above 
        //    can stall for a long time
        ...
将文件从foreach缓存出来只会解决问题。我需要某种线程化的回调方式来查找目录中的文件,但我不知道该怎么做。任何帮助都将不胜感激

非常感谢,,
tenpn.

您应该使用ThreadPool类中的线程。这将使其成为后台线程,当应用程序关闭时,它将收到ThreadInterupException。

您应该使用ThreadPool类中的线程。这将使其成为后台线程,当应用程序关闭时,它将收到ThreadInterupException。

您可以在应用程序即将关闭时(加入之前)调用

此外,您可能希望在thread方法中捕获
ThreadAbortException
,并在必要时进行一些终结/清理

try {
    DirectoryInfo dirInfo = new DirectoryInfo(path);
    foreach(FileINfo file in dirInfo.GetFiles(extension)) 
    {
        // with large directories, the GetFiles call above 
        //    can stall for a long time
        ...
    }
}
catch (ThreadAbortException e)
{
    // cleaning
}
您可以在应用程序即将关闭(加入之前)时调用

此外,您可能希望在thread方法中捕获
ThreadAbortException
,并在必要时进行一些终结/清理

try {
    DirectoryInfo dirInfo = new DirectoryInfo(path);
    foreach(FileINfo file in dirInfo.GetFiles(extension)) 
    {
        // with large directories, the GetFiles call above 
        //    can stall for a long time
        ...
    }
}
catch (ThreadAbortException e)
{
    // cleaning
}

我认为这并不能解决问题。。。只有当工作线程进入WaitSleepJoin状态时,ThreadInterruptedException才会引发。因此,在这种情况下,只有当dirInfo.GetFiles完成时才能抛出异常。我认为这并不能解决问题。。。只有当工作线程进入WaitSleepJoin状态时,ThreadInterruptedException才会引发。因此,在本例中,只有在dirInfo.GetFiles完成时才能引发异常。