7

私はリソースからsStreamResourceInfo.Streamを取得するために使用します。使用後のストリームBitmapImageは正しいですか?メモリプロファイラーでは、そうするとエラーが発生するため、質問します。メモリプロファイラーは、破棄されたインスタンスがGCされていないと言います。 CloseDispose

私がウェブを見ると、私はこのトピックへのこの投稿しか見つけることができません。この投稿では、回答者は、処分することは意味がないことを述べています。しかし、状況や効果を見てみると、これは正しくないと思います。誰かが正しい行動が何であるか知っていますか?
追加情報:私が見たmsdnの例では、それらは破棄もクローズもしません。

編集
RickSladkeysの回答のおかげで、私は解決策を見つけました:私StreamResourceInfo.StreamはのStreamSource-propertyに割り当てBitmapImageます。msdnにはのように記述されています。

BitmapImageの作成後にストリームを閉じる場合は、CacheOptionプロパティをBitmapCacheOption.OnLoadに設定します。デフォルトのOnDemandキャッシュオプションは、ビットマップが必要になるまでストリームへのアクセスを保持し、クリーンアップはガベージコレクターによって処理されます。

これはBitmapImage、ストリームの所有権を取得することを意味します。ストリームを手動で閉じる/破棄すると、メモリプロファイラーにエラーが表示されるのはそのためです。ビットマップはストリームへの参照(BitmapCacheOption OnDemand)を保持するため、BitmapImageが有効である限り、GCはストリームを解放しませんが、ストリームはすでに明示的に有効になっています。処分された。この特定の例では、廃棄は悪い考えです。
完全を期すために、msdnで、呼び出された上記のリンクの例も調べましたTextRange.Load。の場合Load、それは反対でLoadあり、所有権を取得しないため、終了後にストリームを閉じる/破棄する必要があります。

4

1 に答える 1

11

混乱は、私はそれが混乱していることに同意しますが、ストリームの所有権の微妙ではあるが重要な概念から来ています。DisposeMSDNの例では、「見て、いや、いやClose、だから私はそうするつもりはないのですか?」と言うようにそれらを見ることができます。

しかし、簡単な答えは、誰かがストリームを閉じる責任を負わなければならないということです。おそらく呼び出しているAPI:

  • Application.GetResourceStream

StreamResourceInfoストリームとURLのプリミティブコンテナであるを返します。明らかに、StreamResourceInfoはストリームを所有していません。したがって、電話をかけるApplication.GetResourceStream 、それに含まれているストリームを所有しているStreamResourceInfoことになります。他に何もしなかった場合は、ストリームを閉じる責任があります。APIは、ストリームのApplication所有権をそれ自体から私たちに値として返すことで譲渡しました。

これで、ストリームを別のエンティティに渡すときに、紛らわしい部分が入ります。MSDNの例を見てみましょう。

// Navigate to xaml page
Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;

この例では、はDisposeありませんClose。ただし、ストリームの所有権、私たち(呼び出し元)からインスタンスに移ります。ストリームはもはや私たちの責任ではありません。私たちは所有権を他の誰かに譲渡しました。実際、ストリームで実行されたときに呼び出します。1つの謎が解決しました。XamlReaderXamlReaderClose

これが非常に問題となる理由は、所有権の概念は通常、ドキュメントに暗黙的に含まれており、「それを理解する」ことになっているためです。うまくいけば、所有権の概念とそれが譲渡可能であるという事実を再考するだけで、新しい所有者が行うであろうセキュリティで電話をかけないことを快適に感じることが容易になります。そして、そうでなくても、それはもう私たちの問題ではありません!Close

于 2011-05-27T03:26:25.400 に答える