2013-08-14 24 views
6

Dieser Code, der unbrauchbar erscheinen könnte, reproduziert das Problem. Eine andere Anwendung verwendet http://printqueuewatch.codeplex.com/, um benachrichtigt zu werden, wenn ein Druckauftrag an den Drucker gesendet wird. Es funktioniert, aber manchmal, wenn Sie einen Druckauftrag senden, stürzt es hier ab GetPrintJobInfoCollection. Ich habe die innere Ausnahme eingefügt. Zum Reproduzieren sende ich mit Notepad ++ oder meiner Anwendung eine kleine Textdatei etwa 20 mal, bis ich einen Absturz bekomme. Wenn ich nach dem Absturz GetPrintJobInfoCollection aufrufen funktioniert es erfolgreich oder ich versuche es erneut.GetPrintJobInfoCollection() Ausnahme manchmal

Irgendwelche Vorschläge, wie Sie das beheben können?

while (true) 
{ 
    Thread.Sleep(10); 

    LocalPrintServer server = new LocalPrintServer(); 

    var q = server.GetPrintQueue("vp1"); 
    q.Refresh(); 
    // Debug.WriteLine(q.IsBusy); 
    PrintJobInfoCollection infos = null; 
    infos = q.GetPrintJobInfoCollection(); 
} 

Fehler bei

System.NullReferenceException was unhandled Message=Object reference 
not set to an instance of an object. Source=System.Printing 
StackTrace: 
    at MS.Internal.PrintWin32Thunk.AttributeNameToInfoLevelMapping.InfoLevelCoverageList.Release() 
    at MS.Internal.PrintWin32Thunk.EnumDataThunkObject.GetPrintSystemValuesPerPrintJobs(PrintQueue 
printQueue, Queue`1 printObjectsCollection, String[] propertyFilter, 
UInt32 firstJobIndex, UInt32 numberOfJobs) 
    at System.Printing.PrintJobInfoCollection..ctor(PrintQueue printQueue, String[] propertyFilter) 
    at System.Printing.PrintQueue.GetPrintJobInfoCollection() 
    at WpfApplication7.MainWindow.button2_Click(Object sender, RoutedEventArgs e) in 

Antwort

1

Nach this MSDN article sollten Sie nicht System.Printing Namespace verwenden.

Klassen innerhalb des System.Printing-Namespace werden für die Verwendung in einem Windows-Dienst oder einer ASP.NET-Anwendung oder einem Dienst nicht unterstützt. Wenn versucht wird, zu verwenden, um diese Klassen innerhalb eines dieser Anwendungstypen zu verwenden, kann zu unerwarteten Problemen wie verminderter Dienst-Leistung und Laufzeitausnahmen führen. Informationen zum Drucken über eine Windows Forms-Anwendung finden Sie im System.Drawing.Printing-Namespace.

Ich denke, dass Ihr Problem auf Ressourcenverlust zurückzuführen ist. Die LocalPrintServer-Klasse scheint eine nicht verwaltete Ressource zu sein und muss entsorgt werden.