問題タブ [dispose]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
datatable - DataSetとDataTableをDispose()する必要がありますか?
DataSetとDataTableはどちらもIDisposableを実装しているため、従来のベストプラクティスでは、Dispose()メソッドを呼び出す必要があります。
ただし、これまで読んだことから、DataSetとDataTableには実際には管理されていないリソースがないため、Dispose()は実際には多くのことを行いません。
さらに、using(DataSet myDataSet...)DataSetにはDataTablesのコレクションがあるため、使用することはできません。
したがって、安全のために、myDataSet.Tablesを反復処理し、各DataTablesを破棄してから、DataSetを破棄する必要があります。
それで、すべてのDataSetとDataTableでDispose()を呼び出すのは面倒な価値がありますか?
補遺:
DataSetを破棄する必要があるとお考えの方へ:一般に、破棄のパターンはusingorを使用するtry..finallyことです。これは、Dispose()が呼び出されることを保証するためです。
ただし、これはコレクションにとって醜いものになります。たとえば、Dispose()の呼び出しの1つが例外をスローした場合はどうしますか?次の要素を処分し続けることができるように、それを飲み込みますか(これは「悪い」です)?
または、myDataSet.Dispose()を呼び出すだけで、myDataSet.TablesのDataTablesを破棄することを忘れることをお勧めしますか?
c# - 匿名メソッドでキャプチャされた変数をどのように解放/破棄/破棄しますか?
COM オブジェクトでイベントを処理するために匿名メソッドを使用しています。プログラムが終了すると、監視していたすべてのリソースに対して最初の例外 (InvalidComObjectException) が発生するという点で、匿名メソッドで使用しているリソースが「正しく閉じられていない」ように見えます。これは大したことではないと思いますが、「正しい」とは感じません。
匿名メソッドの範囲外でキャプチャされた変数にアクセスする方法を理解することはできません(とにかく、できるはずはありません)。アプリケーションを終了する前にリソースを閉じる/破棄するにはどうすればよいですか?
編集: 簡単に読み直した後、ここで何をしているのかはっきりしないかもしれません。COM オブジェクトを使用するマネージ アプリケーションを作成しています。
さらに編集: ArcGIS Engineを使用して GIS データを操作しています。この特定のケースでは、ILayerEvents_Event の VisibilityChanged イベントを使用して、GIS レイヤーがいつ表示または非表示になるかを監視しています。イベントはブール値 (可視または不可視) のみを渡し、レイヤー名は渡さないため、可視状態の変更を作成するには、レイヤーごとにメソッドを作成する必要があります。私は動的レイヤーを扱っているので、何らかの形でこれを動的に行う方法が必要だったので、匿名メソッドが必要でした。
anonymoua メソッド内に、(ILayer コンテキスト内の) 外側のループから ILayerEvents_Event を取得する ILayer 変数があるため、どのレイヤーを使用しているかがわかります。私が立ち往生しているのはこの時点です。機能は機能し、アプリケーションを終了するまですべてが壮大で、20 以上の参照がそこにぶら下がっていて、行く場所がなく、例外があります。
ユーザーが最後にレイヤーを非表示/表示する時期がわからないため、最後に物事を無効にする方法はありません。何も害がないように見えるので、そのままにしておくことができると思います(または、匿名メソッドよりもこれを行うためのより良い方法があるかもしれません)。何かが足りないと思うだけです。
c# - フォームが破棄されるときにサブフォームを破棄する WinForm
サブフォームを開くことができるフォームがあります( を使用ShowDialog)。メインフォームが完成したときにサブフォームが適切に破棄されていることを確認したい。サブフォームをメインフォームのメンバーに追加してみましたcomponentsが、現時点ではArgumentNullException.
自分自身をインスタンス化できることはわかっていますがcomponents、それは少し危険ではありませんか? ある日、デザイナー ビューにコンポーネントを追加するとnew Container()、designer.cs ファイルに行が生成され、ヒープで 2 つのコンポーネント インスタンスが実行されていることを知ることはありません。
サブフォームが破棄されていることを確認する簡単な方法はありますか?
編集 - 私のソリューションを回答に移動しました
c# - Webブラウザコントロールを動的に作成して破棄する方法はありますか?
Webbrowserコントロールを使用して自動ブラウジングを行うこのアプリがあります。ブラウザを自動的に閉じて(破棄して)、実際に機能する別のインスタンスを作成する方法を考え出す必要があります。
これが私がこれまでに持っているコードのいくつかです。
それで、webbrowerインスタンスを破棄するかどうかを考えていました。
次に、webbrowserオブジェクトの新しいインスタンスを作成します。
残念ながら、これは機能しません。ブラウザの新しいインスタンスは表示されず、破棄されたブラウザオブジェクトはWindowsフォームでフリーズしたままになります。
私が間違っていることはありますか?
ありがとう
c# - .Net 1.1 の FileStream に IDisposable を実装する方法
これはくだらない質問のように思えるかもしれませんが、たとえそれが using ブロックにあるとしても、FileStream で Close() を呼び出す必要があると誰かが主張しているのを聞いたので、これを見ていました (そして、Close() が呼び出されているコードがあります)。ブロックの最後にある)。
Close() が Dispose() を呼び出すことを意図していることは知っていますが、これは .Net 1.1 コードであり、私の経験の大部分は 2.0 を使用しているため、さらに詳しく調べると思いました。
私が驚いたことの 1 つは、FileStream の MSDN ドキュメントには、.Net 2.0 の Dispose() と Dispose(bool) があり、.Net 1.1 の Dispose(bool) しかないことです。
これは見落としかもしれないと思ったので、Reflector を使用してアセンブリを調べました。そこにも Dispose(bool) が表示されますが、Dispose() は表示されません。
これは正しいです?もしそうなら、ここでの話は何ですか?FileStream は using ブロックで動作します。これは、私の知る限り、Dispose() のみを宣言する IDisposable を実装する必要があることを意味すると考えました。
コンパイラの魔法が起こっているのでしょうか、それとも Dispose() の非表示の実装がどこかにありませんか (おそらく、 Dispose(true) または Dispose(false) を呼び出しますか?)
最後に (しゃれは意図していません)、ブロックを使用して FileStream をスコープすると、.Net 1.1 のスコープ出口でストリームが閉じられることを確認できますか?
[編集]
明確にするために、これは C# コードです。VB.Net は .Net 2.0 まで using ステートメントを取得できなかったことを理解していますが、私の理解では、C# には 1.1 が含まれていました (そして、ここにある私の 1.1 コードにはそれが含まれており、コンパイルされます)。
c# - キャプティブ IE セッションからアプリケーションを閉じる
私の質問は、「これをもっとうまくできるでしょうか?」もしそうなら、どのように?何か案は?
「非表示」の C# .NET 3.5 アプリケーション内からキャプティブ IE セッションを開始し、特定の要求を処理した後、IE セッションと「親」アプリケーションの両方を終了する必要があります。
私は先週かそこらの間、この問題をいじっていました...そして今朝、私は最終的に堅牢な解決策であると思うものに到達しました。しかし、私は C# 初心者なので (プロのプログラマーとして 10 年間働いています)、セカンド オピニオンまたはサード オピニオンを求めています。およびその他のオプション、批評、提案、またはコメント... 特に: SHDocVw は、「キャプティブだが埋め込まれていない」Internet Explorer セッションを作成するための推奨される方法ですか?
見ての通り、扱いにくいのはアンマネージInternetExplorerApplicationCOM オブジェクトを破棄することです。IDisposableInternetExplorer
私の基本的なアプローチは次のとおりです。
- ApplicationContext であり、IQuitable である Application.Run MyApp。
- IEリクエストを待っている間、プログラムを開いたままにしておくためにアプリが必要だと思いますか?
- (デーモンではない)リスナーループスレッドも機能するのではないでしょうか?
- MyApp のコンストラクターは、(IQuitable)this を渡す新しいInternetExporerオブジェクトを作成します
InternetExporerのコンストラクターが新しい IE セッションを開始し、それを URL にナビゲートします。- 特定の URL が要求されると、 InternetExporerは「親」の Quit メソッドをコールバックします。
バックグラウンド:
本当の話: 私はMapInfo (A GISクライアント) 用のプラグインを書いています。このプラグインは、IE からサーバーへの「Start Extraction」HTTP 要求をハイジャックし、URL をわずかに変更して、その場所に HTTPRequest を送信します。respose XML を解析してMIF ファイル[PDF 196K] に変換し、これをインポートして MapInfo で開きます。次に、IE セッションを終了し、「プラグイン」アプリケーションを閉じます。
SSCCE
c# - C# Dispose メソッド
C# の 'Dispose' パターンに問題があります。ここでは、管理クラス、フォーム、およびデータ ストレージ クラスの 3 つのクラスを使用します。
管理クラスは (必要に応じて) フォームを使用して、ユーザーに入力を求めることができます。フォームはファイルからデータをロードし、ユーザーはそれを変更できます。フォームが閉じられると、フォームはこのデータを保存し直す必要があります。データ ストレージ クラスは .Dispose() を実装しており、変更をディスクに書き込みます。
このデータ ストレージ クラス (StoredInfo) はフォーム (MyForm) のメンバーであるため、MyForm は StoredInfo.Dispose を呼び出すために .Dispose() も実装する必要があります。これが私に問題を与えているものです。私の管理クラスは、そのコードで次のことを行います。
そして私のフォーム:
...まだ Form.Dispose() メソッドは呼び出されません。デバッガーでステップ実行すると、実行は次のようになります。
どういうわけか、.Dispose を呼び出さず、代わりに .Dispose(bool) を呼び出しました。引数にデフォルト値を設定できる C++ ではこれを確認できますが、C# ではわかりません。私の最良の推測は、デバッガーが実際に何が起こっているのかを示していないということです。
クラス階層を見ると、IDisposable を実装する他のクラスが表示されます。つまり、別の Dispose() メンバーがどこかにあるはずです。仮想ではないため、コンパイラ エラーが発生しない理由がわかりません。.Dispose(bool) メソッドが呼び出され、仮想であるため、オーバーライドしようとしましたが、これで:
「タイプ 'ConnectorForm' は、同じパラメーター タイプを持つ 'Dispose' というメンバーを既に定義しています」と表示されます。したがって、それはオプションではありません。Dispose() の呼び出しに戻ります。しかし、どのように?現時点では、C++ デストラクタの純粋なシンプルさとパワー、決定論が恋しいです。
c# - 非同期メソッドが呼び出されたオブジェクトを破棄する方法は?
PreloadClientを実装するこのオブジェクトがありIDisposable、それを破棄したいのですが、非同期メソッドが呼び出しを終了した後...これは発生していません
それで、アイデアや回避策はありますか??
jquery - jQueryはウィンドウのアンロード時にイベントを自動的に破棄しますか?
たとえば、私が持っているページで
アンバインド コードも追加する必要がありますか? それとも、jQuery が自動的にこれを行いますか?