2009-05-21 8 views
3

私はWPFアプリケーションを開発しました。そのアプリケーションでは、リストボックスに200MBの写真をロードします。その画像をキャンバスに追加します。キャンバスに写真を追加しています(10MBイメージを追加した後)。----WPFアプリケーションのパフォーマンスを上げる方法

** *** CLRはCOMコンテキスト0x10b46f0からCOMコンテキスト0x10b4860に60秒間移行できませんでした。宛先コンテキスト/アパートメントを所有するスレッドは、ポンピング待機を行わないか、Windowsメッセージをポンピングせずに非常に長い実行操作を処理する可能性が最も高いです。この状況は一般的にパフォーマンスに悪影響を及ぼし、アプリケーションが応答しなくなったり、メモリ使用量が時間の経過とともに累積的に蓄積することさえあります。この問題を回避するには、シングルスレッドアパートメント(STA)のすべてのスレッドでポンプ待機プリミティブ(CoWaitForMultipleHandlesなど)を使用し、長時間実行される操作で定期的にメッセージを送信する必要があります。私のアプリケーション。この問題の解決策が必要です。

これには何も提案はありません。

答えて

5

UIスレッドですべての200 MBの写真をリストボックスに一度に読み込まないでください。ユーザーは一気に200MBを見ますか?それはあなたの仕事でいくらかの作業をするでしょうが、バックグラウンドスレッドからの画像の読み込みを遅らせる必要があります。

+0

はい、ユーザーはリストボックスにすべての画像を見ます。リストボックスに画像を読み込むことは問題ではありません。私はバックグラウンドスレッドを使っている。問題はキャンバスに写真を追加することです。加えて私はバックグラウンドワーカーを使用しました。 –

3

article(.NETアプリではデッドロックを回避して検出する高度な手法)をご覧ください。

0

これは2つの質問のようです。まず、バックグラウンドスレッドでイメージを読み込んでいて、正しく実行していないことです。したがって、COMエラーです。 STAThreadアプリケーションがあり、イメージ読み込みスレッドがWPFディスパッチスレッドと正しく相互作用していないことを再度確認します。 MTAとSTAの比較はdiscussionです。しかし、WPFにはSTAが必要であり、それを戦うための紛らわしい戦いです。

2番目の質問は、これをどのように行うべきかのようです。つまり、表示用の画像を読み込むことです。私は、ListViewの遅延データバインディングを使用し、組み込みの仮想化プレゼンターが画像のロード/表示を管理できるようにします。

view-modelの使用に関するいくつかのドキュメントがあります。 viewmodelはイメージのロードを調整し、自動的にアプリケーションを動作させるバインディングソースをListViewに提供することができます。

もっと簡単な方法は、バックグラウンドスレッドを起動し、ObservableCollection <>にイメージをロードし、そのイメージをListViewにバインドして、フレームワークに表示させます。

Greg Dが言ったように、200MBの画像を読み込むと、問題のレシピのように聞こえるようになります。

関連する問題