none
Threads metodo WaitHandle.WaitAll(waitHandles) RRS feed

  • Pregunta

  • Hola, estoy haciendo una aplicacion que me carga una lista de items de datos de archivos de distintas carpetas del disco duro. Para hacer esto utilizo Threads.
    El problema es que cuando llamo al método WaitHandle.WaitAll(waitHandles), me dice: "No se admite WaitAll en varios identificadores en un subproceso STA"
    Acá esta mas o menos el código:
                           
            public void TraverseTree(object info)
            {
                ThreadInfo ti = (ThreadInfo)info;
                ReaderWriterLock rwl = new ReaderWriterLock();
                Stack<string> dirs = new Stack<string>();

                if (!Directory.Exists(ti.root))
                {
                    throw new ArgumentException();
                }
                dirs.Push(ti.root);

                while (dirs.Count > 0)
                {

                    string currentDir = dirs.Pop();
                    string[] subDirs;
                    try
                    {
                        subDirs = Directory.GetDirectories(currentDir);
                    }
                    catch (UnauthorizedAccessException e)
                    {
                        MessageBox.Show(e.Message, "Autorización de Acceso");
                        continue;
                    }
                    catch (System.IO.DirectoryNotFoundException e)
                    {
                        MessageBox.Show(e.Message, "Busqueda de Directorio");
                        continue;
                    }

                    string[] files = null;
                    try
                    {
                        files = Directory.GetFiles(currentDir,"*.mp3");
                    }

                    catch (UnauthorizedAccessException e)
                    {

                        MessageBox.Show(e.Message, "Autorización de Acceso");
                        continue;
                    }

                    catch (DirectoryNotFoundException e)
                    {
                        MessageBox.Show(e.Message, "Busqueda de Directorio");
                        continue;
                    }
                    foreach (string file in files)
                    {
                        try
                        {
                            rwl.AcquireWriterLock(500);
                            if (TagLib.File.Create(file).Tag.Title != null)
                            {
                                StreamWriter writer = System.IO.File.AppendText(Environment.CurrentDirectory+"\\lista.lst");
                                writer.WriteLine(TagLib.File.Create(file).Tag.Title);
                                writer.Close();
                            }
                                rwl.ReleaseLock();
                        }
                        catch (FileNotFoundException e)
                        {
                            MessageBox.Show(e.Message, "Abrir Archivo");
                            continue;
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show(e.Message, "Error de Rererencia Nula");
                            continue;
                        }
                    }

                    foreach (string str in subDirs)
                        dirs.Push(str);

                }
                ti.are.Set();
            }
           

    class ThreadInfo
            {
                public string root;
                public AutoResetEvent are;

                public ThreadInfo(string _root, AutoResetEvent _are)
                {
                    root = _root;
                    are = _are;
                }
            }


            private void btnAgregarCarpeta_Click(object sender, EventArgs e)
            {

                           AutoResetEvent[] waitHandles = new AutoResetEvent[directorios.Length];
                            int i=0;
                            foreach (string dir in directorios)
                            {
                                waitHandles[i] = new AutoResetEvent(false);
                                ThreadInfo ti = new ThreadInfo(dir, waitHandles[i]);
                                ThreadPool.QueueUserWorkItem(TraverseTree, ti);
                                i++;
                            }
                            WaitHandle.WaitAll(waitHandles);   
                            StreamReader sr = new StreamReader(Environment.CurrentDirectory + "\\lista.lst");
                                while (sr.ReadLine() != "")
                                    listaReproduccion.Items.Add(sr.ReadLine());
                                System.IO.File.Delete(Environment.CurrentDirectory + "\\lista.lst");
    }

    muchas gracias.
    viernes, 16 de octubre de 2009 23:10

Todas las respuestas

  • Hola Juan Manuel,

    esta aplicación es una aplicación web? Si es así, los MessageBox van a servirte de bien poco. De hecho seguramente te bloqueen el código a la espera de que el usuario pulse el botón por defecto de ese dialogo.

    En cualquier caso, si no es una aplicación Web, el foro es equivocado, pues este foro es para Desarrollo Web (ASPNET entre otros).

    De todas formas, en tu método public static void main tiene el atributo STAThread? ES decir, se parece a esto?

    [STAThread()]
            static void Main(string[] args)
            {
            }
    Si tienes el atributo, suprímerlo. En caso contrario prueba a añadirlo, aunque no creo que eso sea la solución.


    En caso de que la respuesta te sirva, porfavor, márcala como válida

    Muchas gracias y suerte!


    Javier Jiménez Roda


    MCP (Microsoft Certified Professional)
    MCTS (Microsoft Certified Technology Specialist)
    MCPD (Microsoft Certified Professional Developer)
    Blog: http://jimenezroda.wordpress.com

    sábado, 17 de octubre de 2009 18:01
  • La aplicacion es windows form. y ya probe lo que decis y no funciona. Alguna otra idea?? Te comento que si yo no pongo el codigo WaitAll, todo funciona perfecto. El problema esta all llamar a este método.
    domingo, 18 de octubre de 2009 9:27