[ Valerij Zajcev @ 28.01.2010. 11:09 ] @
Preko PDFBOX-a ucitavam kolekciju PDF fajlova, i Njihove kompletne tekstove koristim u programu. Problem je taj sto mi u toku ucitavnaja izbaci error:
Citat:

context switch deadlock was detected

The CLR has been unable to transition from COM context 0x1fda00 to COM context 0x1fdc28 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time...


Onda sam izbacio ovaj proces na poseban thred (nadam se da je ispravno nikada nisam radio sa thread-ovima):
Code:

private void button5_Click(object sender, EventArgs e)
        {            
            ThreadStart threadDelegate = new ThreadStart(ReorderPdfFolder);
            simpleThread = new System.Threading.Thread(threadDelegate);
            simpleThread.IsBackground = true;
            simpleThread.SetApartmentState(ApartmentState.STA);
            simpleThread.Start();
        }

Code:

private void ReorderPdfFolder()
        {            
            string pathToUnsortedFolder = null;
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            fbd.RootFolder = Environment.SpecialFolder.MyComputer;

            if (fbd.ShowDialog() == DialogResult.OK)
            {
                pathToUnsortedFolder = fbd.SelectedPath;
            }

            
            DirectoryInfo dir = new DirectoryInfo(pathToUnsortedFolder);
            FileInfo[] filesInCurrentDirectory = dir.GetFiles();

            PDDocument pdfDocument;
            PDFTextStripper pdfStripper = new PDFTextStripper();

            List<string> completed = new List<string>();

            foreach (FileInfo f in filesInCurrentDirectory)
            {
                try
                {
                    pdfDocument = PDDocument.load(f.FullName);
                    string tempPdfText = pdfStripper.getText(pdfDocument);                   
                    
                    completed.Add(tempPdfText);
                }
                catch (System.Exception)
                {
                    continue;
                }
            }
        }
    }


Negde na pola rada izbaci mi onaj error odozgo i ja mu kazem continue i on nista nastavi i dalje i zavrsi sve. Problem je sto ne znam kako da izbegnem da taj error ne izbacuje. Zna li neko kako?
[ deerbeer @ 28.01.2010. 11:36 ] @
Probaj da setujes AppartmentState na MTA (Multithreaded) ili
da primenis atribut MTAThreadAttribute Class
http://msdn.microsoft.com/en-u...system.mtathreadattribute.aspx
jer ocigledno COM komponenta za PDF fajlove otvara zasebno nove tredove
te stoga CLR mora da "prepozna" tu situaciju tj.bude ukljucen da radi u COM interoperability modu za vise tredova .

[ Valerij Zajcev @ 28.01.2010. 12:54 ] @
Citat:
Probaj da setujes AppartmentState na MTA (Multithreaded) ili
da primenis atribut MTAThreadAttribute Class
http://msdn.microsoft.com/en-u...system.mtathreadattribute.aspx
jer ocigledno COM komponenta za PDF fajlove otvara zasebno nove tredove
te stoga CLR mora da "prepozna" tu situaciju tj.bude ukljucen da radi u COM interoperability modu za vise tredova .


Kada to uradim dobijem sledecu gresku.

Citat:

Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.


I to mi lupi na ovoj liniji:
Code:

if (fbd.ShowDialog() == DialogResult.OK)
[ deerbeer @ 28.01.2010. 13:23 ] @
Izbaci open fajl dijalog iz treada i prosledi mu samo listu (List<string>) fajlova koje obradjuje .
A to mozes na vise nacina : http://www.yoda.arachsys.com/csharp/threadstart.html
Dijalozi moraju pripadati UI thread-u tj. sa STA atributom a to je i glavni tred aplikacije.

Dakle u glavnom tredu pokupi listu fajlova a onda ih kroz MTA tred obradjuj .
A testa radi pre nego sto to napravis u ovoj tred petlji prosledi jedan fajl
tj .hard-kodovanu putanju cisto da bi video da li MTA atributi zadovoljavaju COM interop.





[ Valerij Zajcev @ 28.01.2010. 13:37 ] @
Citat:
deerbeer: Izbaci open fajl dijalog iz treada i prosledi mu samo listu (List<string>) fajlova koje obradjuje .
A to mozes na vise nacina : http://www.yoda.arachsys.com/csharp/threadstart.html
Dijalozi moraju pripadati UI thread-u tj. sa STA atributom a to je i glavni tred aplikacije.

Dakle u glavnom tredu pokupi listu fajlova a onda ih kroz MTA tred obradjuj .
A testa radi pre nego sto to napravis u ovoj tred petlji prosledi jedan fajl
tj .hard-kodovanu putanju cisto da bi video da li MTA atributi zadovoljavaju COM interop.


To je to, radi.