問題タブ [finalize]

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.

0 投票する
2 に答える
213 参照

c# - 「using」ステートメント内の致命的な障害、つまりusing(var a = new stream())およびa.Something()が例外をスローする

したがって、usingブロックステートメントの最後に、disposeメソッドが呼び出されることを理解しています。

を使用するとどうなりますか'using(var a = new Stream()) { a.SomethingThrowsAnException() }'

ストリームはまだ彼のdisposeメソッドを通過しますか?

IDisposableを実装するクラスを作成しましたが、メモリ内の内容を失わないことがミッションクリティカルであるため、何か壊滅的な事態が発生した場合、つまり使用しているオブジェクトのようなカスタムストリームがある場合は、データをシリアル化することを計画していました。

助言がありますか?

ありがとう。

0 投票する
1 に答える
173 参照

.net - 単体テスト内でのファイナライズ例外の検出

単体テスト中に作成されたすべてのオブジェクトを強制的にファイナライズする方法はありますか? 私が遭遇し続ける問題は、失われたGCHandleインスタンスによるリークは、プロセス自体 ( AppDomain! ではなく) が終了したときにのみ確定されるように見えることです。これは、アセンブリ内のすべてのテストが実行された (そして潜在的に「合格」した) 後です。

私の最善の、しかし不十分な C# での試み:

これを実行すると、「合格」テストになりますが、バックグラウンド スレッドに未処理の例外があったという通知が表示されます。複数のテストを行うアセンブリでは、これは理想的とは言えません。

0 投票する
1 に答える
669 参照

c# - Finalize() メソッドをオーバーライドするように MSDN が言及するのはなぜですか?

C# クラスに関する最初のレッスン以来、クラスのFinalize()メソッドを明示的に呼び出すことができない (ガベージ コレクターによって呼び出される) だけでなく、それをカスタム クラスに実装することさえ許可されていないことを学びました。
私を少し混乱させるのは、MSDNのようにここにあるということです-

By default, the Object.Finalize method does nothing. If you want the garbage collector to perform cleanup operations on your object before it reclaims the object's memory, you must override this method in your class.

他の何かを示唆する多くの場所を見つけました。その理由を明確にできる人はいますか?

0 投票する
1 に答える
510 参照

c# - スレッドが終了したときに「最終的に」同じスレッドで実行されるようにする

ここにあなたたちのためのパズルがあります。一部のスレッドがロックやセマフォなどの管理対象リソースを操作するマルチスレッド プログラムがあります。ロック解放プリミティブの一部は、ロックの取得が行われた同じスレッドからのみ実行できます。

だからここに私のパズルがあります: 私はこれらの種類の操作をラップします: try { lock-acquire... do something } finally { lock-release } しかし、スレッドが終了すると、finally 句が .NET ガベージ コレクション スレッドによって実行され、私のスレッドではありません。(特定のケースには、実際には「using」ステートメントで割り当てられたオブジェクトの Dispose が含まれます。詳細については、以下を参照してください)

これはデモが少し難しいです。私は Isis2 でいつもそれを目にします。私は、取得ブロックとファイナライズ ブロックのスレッド ID をチェックすることで、これが起こっていることを理解しました。しかし、3 行のデモはありません。申し訳ありません。私はそれが助けを提供しやすくすることを知っています.

そのスレッドに関連付けられているすべての保留中のファイナライズ ブロックが実行されるまで、スレッドの終了を遅らせる方法はありますか?

---- マークの詳細を追加 ----

私が実際に行っているのは、スレッドの優先度を備えたさまざまなロックの抽象化 (境界のあるバッファー、バリア、通常のロックなど) を持ち、デッドロック、優先度の逆転、非常に遅いロック付与を自己検出するように設計された、かなり精巧な自己計装ロック パッケージです。その他の問題。私のコードは十分に複雑で十分にスレッド化されているため、デバッグするにはこれが必要でした。

私の基本的な構成スタイルの例は次のとおりです。

LockObject は自己監視ロックです... LockAndElevate は、ロックしたことを記録し (この場合)、ロックを解除したときに破棄を追跡します。したがって、例外がスローされたとしても、ブロックが完了すると新しいオブジェクトを破棄する必要があるという事実を利用しています。

私が見ているのは、かなり頻繁にスレッドが終了し、まだ使用中の破棄イベントが実際に発生していないことです。それらは後で別のスレッドで実行されます。これは、スレッドの 1 つが終了したときにのみ発生します。通常の実行では、すべてが魔法のように機能します。

したがって、変換を使用して試してから...最後に、私の質問はfinally句の観点から投稿されました。

0 投票する
5 に答える
14200 参照

java - finalize() が常に呼び出されるようにする方法 (Java 演習で考える)

Bruce Eckel のThinking in Java 4th editionにゆっくりと取り組んでいますが、次の問題に悩まされています。

メッセージを出力する finalize( ) メソッドを持つクラスを作成します。main( ) で、クラスのオブジェクトを作成します。finalize( ) が常に呼び出されるように、前の演習を変更します。

これは私がコーディングしたものです:

ブール値が に設定された新しいHorseオブジェクトを作成します。ここで、メソッド内で が であるかどうかを確認します。そうであれば、メッセージを出力します。inStablefalsefinalize()inStablefalse

残念ながら、メッセージは印刷されません。条件が に評価されるので、そもそも呼び出されていないとtrue思います。finalize()プログラムを何度も実行しましたが、エラー メッセージが表示されるのは数回だけでした。System.gc()が呼び出されると、ガベージ コレクターは参照されていないオブジェクトを収集するという印象を受けました。

正解をグーグルで検索すると、このリンクが表示されました。これにより、より詳細で複雑なコードが得られます。、 、などSystem.runFinalization()、これまでに見たことのないメソッドを使用します。Runtime.getRuntime()System.runFinalizersOnExit()

どのように機能するか、強制的に実行する方法をよりよく理解できる人はfinalize()いますか? または、ソリューション コードで行われていることを順を追って説明してくれますか?

0 投票する
2 に答える
1599 参照

c# - C# で DeviceIoControl と FSCTL_MAKE_MEDIA_COMPATIBLE を使用して Live File System (LiveUDF) ディスクをファイナライズする方法は?

C# で Live File System (または「Live UDF」) 光ディスクをファイナライズしようとしています。MSDN および TechNet の記事とさまざまなフォーラムへの投稿を読んで理解したところによると、Image Mastering API (または IMAPI) はこのタイプのファイルシステムをサポートしていません。また、コーディング作業で IMAPI を使用して LiveUDF ディスクをファイナライズすることに失敗しました。その結果、FSCTL_MAKE_MEDIA_COMPATIBLE 制御コードを使用して DeviceIoControl 関数を使用しています。

まず、DeviceIoControl を同期的に呼び出していましたが、関数は 1117 を返し、ディスクは最終的に数分後にファイナライズされました。最終的な失敗または実際の成功の場合にのみプロセスを返す必要があるため、この結果は受け入れられません。

次に、CreateFile で FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes フラグを指定してデバイス ハンドルを開き、NativeOverlapped オブジェクトを DeviceIoControl 呼び出しに渡すことで、DeviceIoControl を非同期的に呼び出します。その前に、明らかに、オーバーラップ イベントを処理するために IOCompletionCallback を設定しました。

説明したように DeviceIoControl を非同期で呼び出すと、(同期的に呼び出された場合と同様に) ほとんどすぐに 1117 が返され、IOCompletionCallback メソッドは呼び出されず、ディスクは数分後にファイナライズされます。

私の質問は: C# と DeviceIoControl を使用して Windows 7 プラットフォーム上の C# で Live File System (または「Live UDF」) 光ディスクをファイナライズするにはどうすればよいですか (プロセスが完了するまで「待機」する機能を使用して、同期的または非同期的に)最終的な成功または失敗の結果をキャプチャするため)?

よろしくお願いします。

0 投票する
1 に答える
1195 参照

delphi - 関数の型指定されていないパラメーターを介して渡されたレコードをファイナライズする方法は?

プロシージャに「任意の」レコード タイプを渡すことはできますか?

文字列で「レコード」を何度も使用しました。

それらをクリアするには、次のように書く必要があります。

問題は、どのような種類のレコードを渡してクリアするかということです。

このために、「式には初期化/ファイナライズは必要ありません」というヒントを得ました。

いつも情報ありがとうございます!

0 投票する
1 に答える
289 参照

java - Java Finalizer メソッドと GC

ファイルをいくつかの情報とともに保存して閉じるために、 finalize メソッドがオーバーライドされたオブジェクトを作成しました。そのオブジェクトは別のオブジェクトから弱参照されています。GC が発生したときにオブジェクトに変更を保存したいと考えています。そのため、ファイナライズのコードをオーバーライドしました。

ただし、ファイナライズ メソッドは、オブジェクトがガベージ コレクションされる直前に呼び出されます。これは、ガベージ コレクションの対象になった後であればいつでも可能です。

私はこれを望んでいません.GCが発生したらすぐにファイナライズメソッドを呼び出したいのですが、遅延があってはなりません。これを達成するために設定できるjvmオプションはありますか?? 私が見ることができる唯一の他の方法は「System.runFinalization()」ですが、それは粘着性のようです?? もっとエレガントな方法はありますか?

ありがとう

0 投票する
4 に答える
83 参照

java - finalize() を呼び出すにはどうすればよいですか

次のコードでは、出力 Hello を取得しています。クラスと継承チェーンの外で保護された関数を呼び出しているのに、コンパイラがエラーを報告しない理由を誰でも説明できますか?

ありがとう。

0 投票する
2 に答える
1114 参照

c# - C# でのオブジェクト階層の適切な配置

特定のクラス階層が IDisposable を実装するプロジェクトに取り組んでいます。

一部のクラスは Finalize メソッド ( ~MyClass() ) も実装しています。

一般に、次のようになります。

これらのオブジェクトは Dispose() を呼び出すことによって破棄され、後で Finalize メソッドが呼び出されるためクラッシュするように見えるため、Dispose の呼び出しを処理する適切な方法を知りたいです。

階層の最下位クラス (保護された bool が破棄される) にフラグを保持し、クラス階層のすべてのレベルでそれを確認するのが最善ですか?

考えられるすべての解決策には、コードの重複が必要であることがわかりましたが、これは私が求めているものではありません。