- PR -

SQLparameterとトランザクション

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-21 21:54
引用:

nanbuさんの書き込み(2006-02-20 23:43)より:
引用:

System.Drawing.Graphics.FromImage で取得した Graphics も、Dispose 注意です。取得もとの System.Drawing.Image が破棄されます。


とりあえず、2005ではOKのようです。


 ええ、2003 でも、たいていは OK なんです。どういうタイミングでか、ObjectDisposedException が発生するのです。

引用:

Testメソッドが終わったらGCが適切なタイミングで、
(ええ、私がDisposeを実行して処理を遅くするまでもなく)
解放してくれるはず。


 Image、Graphics で使用しているアンマネージドリソースは、いつかは解放してもらえます。が、「解放してくれない書き方」が存在します(^-^; → Dispose、、、(その2)
 あと、でかいリソースや、前回コレクト時に確保していたリソースは、世代が上がって回収してもらえないんじゃ?(これは未確認)
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-02-22 02:06
南部です。

引用:

yaさんの書き込み (2006-02-21 11:42) より:

しかしながら、例えばスレッド依存性だのこの話は細かく話すときりがない上、それらの話を十分に考慮できるだけの知識を持ち、それを実行することに対して根拠、実証を持つ必要もあると思います。
そこまでする必要があるなら、Disposeをとりあえず呼ぶほうを選ぶってだけです、私は。using便利だねぇ。


、、、Disposeで。


引用:

Jittaさんの書き込み (2006-02-21 21:54) より:
 ええ、2003 でも、たいていは OK なんです。どういうタイミングでか、ObjectDisposedException が発生するのです。


うぎゃ、それはキビシい。

引用:

引用:

Testメソッドが終わったらGCが適切なタイミングで、
(ええ、私がDisposeを実行して処理を遅くするまでもなく)
解放してくれるはず。


 Image、Graphics で使用しているアンマネージドリソースは、いつかは解放してもらえます。が、「解放してくれない書き方」が存在します(^-^; → Dispose、、、(その2)


ん?リンクのNotReleasableクラス内のMemoryStreamは解放されますよね?「いずれ」。
NotReleasableの参照が無い且つMemoryStreamの参照が無い時に収集された場合。
NotReleasableがネイティブなリソースを保持していたらアウトですが。

コード:
//アンマネージ保持クラスの保持クラス生成
MyClassgeHolder myClass= new UnmaMyClassnageHolder();
//このインスタンスの参照クリア
myClass= null;
//強制収集
GC.Collect();


//アンマネージ保持クラスの保持クラス
public class MyClass
{
  private UnmanageHolder holder;
  public MyClass()
  {
    holder = new UnmanageHolder();
  }
  ~MyClass()
  {
    Debug.WriteLine("MyClassオブジェクトを破棄します。");
  }
}

//アンマネージ保持クラス
public class UnmanageHolder : IDisposable
{
  ~UnmanageHolder()
  {
    Dispose(false);
  }
  public void Dispose()
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }
  protected virtual void Dispose(bool disposing)
  {
    if(disposing)
    {
      Debug.WriteLine("マネージオブジェクトを破棄します。");
    }
    Debug.WriteLine("アンマネージオブジェクトを破棄します。");
  }
}



引用:

中博俊さんの書き込み (2006-02-21 10:35) より:

GCのいいタイミングなので、実際にはまったく動かない可能性もありますしねー
Windowsのハンドルなんかはすぐ使い切れますよ。


引用:

Jittaさんの書き込み (2006-02-21 21:54) より:

 あと、でかいリソースや、前回コレクト時に確保していたリソースは、世代が上がって回収してもらえないんじゃ?(これは未確認)


GC不信、IDisposableアレルギーを緩和しようしたのに、、、、。
これじゃ、火に油。

#何度も言いますが、私はDisposeします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-22 21:00
引用:

nanbuさんの書き込み(2006-02-22 02:06)より:

ん?リンクのNotReleasableクラス内のMemoryStreamは解放されますよね?「いずれ」。
NotReleasableの参照が無い且つMemoryStreamの参照が無い時に収集された場合。
NotReleasableがネイティブなリソースを保持していたらアウトですが。


 はい、、、ご指摘の通り。
# くぅ〜!やっぱり面倒がるとダメねorz

 今回は「GC は Dispose しない」ということで、勘弁してくださいm(__)m
 ただ、「いずれ解放」されますが、その「いつか」が、開発者が望むときではありません。欲しいときに不要なものが確保しているから必要なものが取れない、という状況が発生し得ます。これを、「リーク」といっても差し支えないと思います。


引用:

GC不信、IDisposableアレルギーを緩和しようしたのに、、、、。


 「使ったものはもとの場所に戻す」……私が C 言語から来ているから、違和感なく受け入れられるだけ?

〆 written by Jitta@わんくま同盟 on 2006/02/22
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-02-22 22:07
厳密に言えば恐らく、MemoryStreamはDisposeする必要は無いと推測できますけどね。

まずマネージのみで実装されているでしょうし、アンマネージを使用していたとしても、使用するのはメインメモリリソースのみである可能性が高く(つまり他のクリティカルリソースを保持していない)、それだけならば GC.AddMemoryPressure が完全にカバーできる領域です。

また、CriticalFinalizerObjectの登場によって確実に破棄されることはファイナライザでも保障されるようになりました。
これらより、クリティカルリソース、そうですね、DBのコネクションのように「限られている、それもメインメモリ以外」という条件を満たすアンマネージリソース以外は本質的にDisposeが必要ないことになります。正確に言えばThread依存性を持つリソースも含まれますが(というかこれはDispose以外本当にどうしようもない)。

あと、Componentの基本要素としてDisposeが実装されているという事情があるため、マネージのみのComponentはDisposeを呼ぶ必要はないのに実装されている場合があります。これは呼ばなくてもよいDisposeが意外にあることを示します。
たとえばDataSetとか。こういうものはパターンとしてコンストラクタでGC.SupressFinalizeを呼べばファイナライザコストすらも発生しません。つまりDisposeを呼ぶことの意味がまったくありません。

と。色々示しましたが、こんなの実装であって知る必要なんてないし、「何でもいいから使い終わったらDispose呼べよ、そのほうが問題が少ないのだから」っていうのは何もかわりませんけどね。
ただしまぁ、破棄範囲ぐらいはドキュメントにしっかりと書いてほしいものですね(Streamには「もととなるやつを閉じる」と書いてあるしそうする、しかしConnectionはCommandをDisposeしてもDisposeされなかったりと統一性はないようなので)。破棄されていればすぐにバグとして表に出てくるのでそれほど重大視するものでもないかもしれませんが。

# 大丈夫なのもあるんですが、大丈夫じゃないものもあるんです。
# そして大丈夫なものに対して呼んでも大丈夫なので呼べば全部大丈夫。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-22 23:09
引用:

yaさんの書き込み (2006-02-22 22:07) より:

# 大丈夫なのもあるんですが、大丈夫じゃないものもあるんです。
# そして大丈夫なものに対して呼んでも大丈夫なので呼べば全部大丈夫。


この二言につきるかと、思います。

スキルアップ/キャリアアップ(JOB@IT)