2009-05-14 10 views
10

私はこのエラーを取得しています:親フリーズ可能とは何ですか?このエラーは何を意味しますか?

があることでも何を意味し、その親よりもFreezableの

を別のスレッドに属しているのDependencyObjectを使用することができませんか?それは英語ですか?親はフリーズしていますか、それともフリーズ可能ですか?親が凍結しないようにする方法はありますか?何が起こっている

私はWPFアプリで2つのopenglのWinFormsのコントロールを持っている、そしてこれまでのところ、すべてが(私が思う)スムーズに仕事をしています。今、1つのwinformコントロールがイメージを更新するときに、もう1つのイメージが更新されるようにアップデートを追加しました。それは実際に働いていましたが、今はそのエラーが発生しています。コードを実行するとランダムな場所でクラッシュが発生し、ガベージコレクションの失敗であると考えられます。つまり、別のスレッドの更新によってガベージコレクションが発生し、そのコレクションがランダムに発生します。

例外はメイン実行メソッドで捕捉され、InvalidOperationExceptionです。

私はここでストローを掴んでいます。どこから始めますか?

EDIT:問題を引き起こしているコールはこの1つであるように見えます:

 if (imagePanel.InvokeRequired) 
     { 
      imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{ 
       imagePanel.ClearImages(); 
      })); 
     } 
     else 
     { 
      imagePanel.ClearImages(); 
     } 

、私はまだそれを追跡しています。その一連の行がコメントアウトされても、クラッシュは発生し、スレッドステータスには「ただ終了」のスレッドがあります(ガベージコレクションの前提)。

+1

一つ.. –

+1

タイトルの文言が非常に悪い。誰もタイトルに何もないので、関連するキーワードを検索することでこの質問を見つけることはできません。これはサポートフォーラムではなく、あなたの質問を適切に策定します... – Timwi

+1

ちょっと@ティムウィ、答えをお読みください。私は答えを見つけたので、私はここでこの質問を残したことに気付くが、それは非常にイライラしていた。タイトルを編集したい場合は、担当者を増やして、自分の考え方に合わせて自分でやってください。 – mmr

答えて

12

OK、わかりました。通常はこの質問を削除するだけですが、これを修正する方法についての情報を見つけるのは苦労です。

問題は、このように見えたの呼び出しだった:

ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    button.background = theBrush; 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
    button.background = theBrush; 
    })); 
} 

しかし!それを行うと、ディスパッチャが動作し、次にブラシを削除しようとしますが、ブラシ自体も明らかに別の場所で削除されています。

あなたがImageBrushを宣言するのであれば、手取りレッスンがあり、そのようにように、同じスレッドでそれを削除します。文を図式化すると、参考になるいくつかの例

void MyFunc(){ 
    ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 
    button.background = theBrush; 
} 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    MyFunc(); 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
     MyFunc(); 
    })); 
} 
関連する問題