2013-08-14 33 views
6

このコードは役に立たないように見えますが、問題を再現します。別のアプリケーションでは、印刷ジョブがプリンタに送信されたときに通知するために http://printqueuewatch.codeplex.com/を使用しています。 印刷ジョブを送信するとGetPrintJobInfoCollectionがクラッシュすることがあります。 内部例外を貼り付けました。私はクラッシュするまで私はメモ帳の+ +または私のアプリケーションの約20回小さなテキストファイルを再現するには、 クラッシュ後にGetPrintJobInfoCollectionを呼び出すと正常に動作するか、再試行します。GetPrintJobInfoCollection()例外時々

これを修正する方法を教えてください。

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 

答えて

1

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(); 
} 

エラーがthis MSDN articleによると、あなたはSystem.Printing名前空間を使用しないでください。

System.Printing名前空間内のクラスは、WindowsサービスまたはASP.NETアプリケーションまたはサービス内では使用できません。 がこれらのアプリケーションタイプのいずれかからこれらのクラスを使用しようとすると、 のサービスパフォーマンスが低下し、実行時例外が発生するなどの予期しない問題が発生する可能性があります( )。 Windowsフォーム アプリケーションから印刷する場合は、System.Drawing.Printing名前空間を参照してください。

私はあなたの問題がリソースリークに起因すると考えています。 LocalPrintServerクラスは管理されていないリソースのようで、廃棄する必要があります。

関連する問題