Ik heb een kleine service geschreven om XML berichtjes te transformeren met XSL en deze daarna uit te laten printen. Maar ik krijg deze melding: The calling thread cannot access this object because a different thread owns it.
Voor het checken van de bestanden gebruik ik een timer, die start in de OnStart:
De timed event:
Mochten er bestanden gevonden worden, in de getFiles, wordt de print opdracht aangeroepen:
De print functie:
Bij het aanroepen van de print krijg ik dus bovenstaande melding.
Ik heb al een hoop gevonden over een Dispatcher etc, maar die bestaat niet bij een service.
Voor het checken van de bestanden gebruik ik een timer, die start in de OnStart:
C#:
1
2
3
4
5
6
7
8
| if (findPrinter() > 0) { System.Timers.Timer printNetterCheck = new System.Timers.Timer(); printNetterCheck.Elapsed += new ElapsedEventHandler(OnTimedEvent); printNetterCheck.Interval = 30000; printNetterCheck.Enabled = true; } |
De timed event:
C#:
1
2
3
4
| private void OnTimedEvent(object source, ElapsedEventArgs e) { getFiles(); } |
Mochten er bestanden gevonden worden, in de getFiles, wordt de print opdracht aangeroepen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| foreach (string file in files) { try { StringWriter xslTransformResult = new StringWriter(); XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load(xslPath); xslt.Transform(file, null, xslTransformResult); if (print(xslTransformResult) == 1) { //functie gebeuren |
De print functie:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| private int print(StringWriter transformedXML) { //assume OK int rc = 1; try { StringReader printNetterStreamReader = new StringReader(transformedXML.ToString()); PrintSystemJobInfo printNetterJob = printer.AddJob("PrintNetterPrint"); Stream printNetterStream = printNetterJob.JobStream; Byte[] printNetterByteBuffer = UnicodeEncoding.Unicode.GetBytes(printNetterStreamReader.ReadToEnd()); printNetterStream.Write(printNetterByteBuffer, 0, printNetterByteBuffer.Length); printNetterStream.Close(); } catch (Exception e) { //return fail rc = -1; eventLog.WriteEntry("Error printing: " + e.Message, EventLogEntryType.Error); } return rc; } |
Bij het aanroepen van de print krijg ik dus bovenstaande melding.
Ik heb al een hoop gevonden over een Dispatcher etc, maar die bestaat niet bij een service.