Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dobijam deadlock na ucitavanju pdf fajla

[es] :: .NET :: Dobijam deadlock na ucitavanju pdf fajla

[ Pregleda: 914 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.hermes-softlab.com.



+2 Profil

icon Dobijam deadlock na ucitavanju pdf fajla28.01.2010. u 11:09 - pre 185 meseci
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?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: Dobijam deadlock na ucitavanju pdf fajla28.01.2010. u 11:36 - pre 185 meseci
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 .


Viva lollapalooza
 
Odgovor na temu

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.hermes-softlab.com.



+2 Profil

icon Re: Dobijam deadlock na ucitavanju pdf fajla28.01.2010. u 12:54 - pre 185 meseci
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)
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: Dobijam deadlock na ucitavanju pdf fajla28.01.2010. u 13:23 - pre 185 meseci
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.






Viva lollapalooza
 
Odgovor na temu

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.hermes-softlab.com.



+2 Profil

icon Re: Dobijam deadlock na ucitavanju pdf fajla28.01.2010. u 13:37 - pre 185 meseci
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.
 
Odgovor na temu

[es] :: .NET :: Dobijam deadlock na ucitavanju pdf fajla

[ Pregleda: 914 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.