9

.NET で非同期呼び出し、つまり HttpWebRequest.BeginGetResponse を行うと想像してください。HttpWebRequest オブジェクトはより広い範囲で参照されません。ガベージ コレクターはそれを破壊し、問題を引き起こしますか?

コード例:

using System;
using System.Net;

public class AsyncHttpWebRequest
{
    void Main()
    {
        var Request = HttpWebRequest.Create("http://www.contoso.com");
        var result = Request.BeginGetResponse(GetResponseCallback, null);
    }

    private void GetResponseCallback(IAsyncResult AsyncResult)
    {
        // Do Something..
    }
}

代替バージョン (リクエストが AsyncState として渡される):

using System;
using System.Net;

public class AsyncHttpWebRequest
{
    void Main()
    {
        var Request = HttpWebRequest.Create("http://www.contoso.com");
        var result = Request.BeginGetResponse(GetResponseCallback, Request);
    }

    private void GetResponseCallback(IAsyncResult AsyncResult)
    {
        // Do Something..
    }
}
4

5 に答える 5

11

オブジェクトへの参照がライブ スレッドに含まれている場合、またはオブジェクトが静的に参照されている場合 (どちらの場合も直接的または間接的に)、オブジェクトは有効であり、ガベージ コレクションの対象外と見なされます。

どちらの例でも、非同期 API は要求への参照を (非同期 IO 操作が記録されるスレッド プール内に) 保持するため、完了するまでガベージ コレクションは行われません。

于 2009-01-07T18:58:05.227 に答える
3

いいえ、ガベージ コレクターが問題を引き起こすことはありません。

オブジェクトにアクセスできないからといって、ガベージ コレクターがオブジェクトをクリーンアップするとは思わないください。

ガベージ コレクターは、多数の「ルート」 (到達可能であることがわかっているオブジェクトと参照) から始まります。次に、それらのルートから到達可能なすべてのオブジェクトが検出され、その他すべてが収集されます。

実行中の各スレッド (非同期呼び出しを処理するスレッドを含む) は、ルートのリストに含まれます。

于 2009-01-07T18:58:48.957 に答える
1

GC に関する限り、オブジェクトに参照がない場合、そのオブジェクトへの参照を取得できなくなります。したがって、一時的に参照されていないオブジェクトを持つことはできません。

(これは、管理されていない、または安全でないコードでゲームをプレイするような卑劣なものが何もないことを前提としています)

于 2009-01-07T19:03:21.397 に答える
0

最初のサンプル コードでは、使用しないのに、なぜ Request を作成するのですか?

とにかく、現在スコープ内にあるオブジェクトからのオブジェクトへの参照 (直接的または間接的) が存在しない場合、GCそれを収集する可能性があります。

したがって、最初の例では、プログラムが Main メソッドを終了するときに Request がまだスコープ内にあるため (別のスレッドで)、非同期呼び出しが終了するまで収集されません。2番目の例では、スレッドプールスレッドとコードの両方がオブジェクトへの参照を保持しているため、明らかに収集されません。

于 2009-01-07T18:58:21.233 に答える
0

オブジェクトは、非同期呼び出しの実装によって問題なく参照されたままになります。これは、受信データを要求に関連付けるために、開いているすべての要求のリストを維持する必要があります。ほとんどの場合、.NET はグローバル (またはクラス) 変数を使用して要求を格納します。

于 2009-01-07T18:58:29.237 に答える