JPEG画像でJPEGメタデータエンコーディングを実行するTPLタスクを作成するマネージド.Net/C#アプリケーションがあります。各タスクは、TaskCreationOptions.LongRunningオプションを使用して構築されます。
Task task = new Task( () => TaskProc(), cancelToken, TaskCreationOptions.LongRunning );
TaskProc()は、JpegBitmapDecoderクラスとJpegBitmapEncoderクラスを利用して、JPEGメタデータを追加し、新しい画像をディスクに保存します。このようなタスクは一度に最大2つアクティブにすることができ、このプロセスは無期限に続行する必要があります。
前述の操作をしばらく実行すると、JpegBitmapDecoderクラスのインスタンスを作成しようとすると、このコマンド例外を処理するのに十分なストレージが利用できなくなります。
System.ComponentModel.Win32Exception(0x80004005): MS.Win32.HwndWrapper..ctor(Int32 classStyle、Int32 style、Int32 exStyle、Int3 )のMS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)でこのコマンドを処理するのに十分なストレージがありません2 x、Int32 y、Int32幅、Int32高さ、文字列名、IntPtr親、HwndWrapperHoo k []フック)at System.Windows.Threading.Dispatcher..ctor()at System.Windows.Threading.Dispatcher.get_CurrentDispatcher()at System.Windows.Media.Imaging.JpegBitmapDecoder..ctor(StreambitmapStream、Bit mapCreateOptions createOptions、BitmapCacheOption cacheOption)のSystem.Windows.Media.Imaging.BitmapDecoder..ctor(StreambitmapStream、BitmapC reateOptions createOptions、BitmapCacheOption cacheOption、Guid expectedClsId)
このエラーは、JpegBitmapDecoderを使用してメタデータを追加した場合にのみ発生しました。つまり、タスクがビットマップイメージをエンコードしてファイルに保存するだけの場合、問題は発生しませんでした。Process Explorer、Process Monitor、またはその他の診断ツールを使用した場合、明らかなことは何も明らかになりませんでした。スレッド、メモリ、またはハンドルのリークはまったく観察されませんでした。このようなエラーが発生すると、メモ帳や単語などの新しいアプリケーションを起動できなくなります。アプリケーションが終了すると、すべてが通常の状態に戻ります。
LongRunningのタスク作成オプションは、MSDNで次のように定義されています。タスクが長時間実行される粗粒度の操作になることを指定します。これは、オーバーサブスクリプションが保証される可能性があるというヒントをTaskSchedulerに提供します。これは、タスクを実行するために選択されたスレッドがThreadPoolからのものではない可能性があることを意味します。つまり、タスクの目的で作成されます。他のタスク作成オプションでは、タスクにThreadPoolスレッドが選択されます。
しばらく分析してテストした後、タスク作成オプションをLongRunning以外のもの( PreferFairnessなど)に変更しました。コードに他の変更はまったく行われませんでした。これにより、問題が「解決」されました。つまり、ストレージエラーが不足することはなくなりました。
LongRunningスレッドが原因である実際の理由については困惑しています。これに関するいくつかの質問があります:
タスクを実行するために選択されたスレッドがThreadPoolからのものであるかどうかという事実が必要なのはなぜですか?スレッドが終了した場合、そのリソースは、その起源に関係なく、GCによって時間の経過とともに再利用され、OSに戻されるべきではありませんか?
LongRunningタスクとエラーの原因となるJpegBitmapDecoderの機能の組み合わせの何が特別なのですか?